你还在遍历搜索荟萃?别逗了!Java 8 一走代码搞定,是真的优雅!

admin

背景

是的,倘若你想搜索 List 荟萃,在 Java 8 之前能够行使自己的 contains/ indexOf 手段来查找元素,但仅限是完善元素,而不及暧昧搜索或者自定义搜索,这时候实在只能遍历。

但现在都 2021 年了,你还在行使传统的遍历荟萃的手段搜索 List 荟萃元素吗?

那你就太 out 了,行使 Java 8 中的 Stream 搜索元素,一走代码即可搞定,而且还真的很优雅!这篇不会介绍 Stream 基础,Stream 系列吾之前写过一个专题了,不懂的关注公多号Java技术栈,然后在公多号 Java 教程菜单中浏览。

Stream 搜索

在 Java 8 中,能够将  List 荟萃转换成 Stream,Stream 挑供了一系列兴旺的搜索功能,比如:filter、find*、*Match 等手段,一走代码就能搞定搜索。

比如现在有初起数据:

public static List<User> list = new ArrayList<>();  /**   * @author: 栈长   * @from: 公多号Java技术栈   */  @BeforeEach  public void initList() {      list.add(new User("公多号Java技术栈-Petty", 22, 1));      list.add(new User("公多号Java技术栈-Tom", 38, 1));      list.add(new User("公多号Java技术栈-Jessica", 43, 0));      list.add(new User("公多号Java技术栈-John", 15, 1));      list.add(new User("公多号Java技术栈-Lily", 25, 0));     list.add(new User("公多号Java技术栈-Lambs", 28, 0));      list.add(new User("公多号Java技术栈-Jack", 45, 1));      list.add(new User("公多号Java技术栈-Addy", 9, 0));      list.add(new User("公多号Java技术栈-Bob", 61, 1));      list.add(new User("公多号Java技术栈-Candy", 26, 0));  } 

用户新闻别离为:姓名、年龄、性别。

filter(过滤)

行使 filter 手段实现自定义搜索,比如搜索 List<User> 荟萃中 一切姓名含有 c 的人:

/**   * 荟萃过滤   * @author: 栈长   * @from: 公多号Java技术栈   */  @Test  public void filter() {      System.out.println("搜索一切姓名含有 c 的人");      list.stream().filter(u -> u.getName().contains("c")).forEach(System.out::println);  } 

输出效果:

findFirst(查找第一个)

查找 Stream 中的第一个元素,比如搜索 List<User> 荟萃中 第一个年经大于 30 的人:

/**   * 荟萃搜索第一个   * @author: 栈长   * @from: 公多号Java技术栈   */  @Test  public void findFirst() {      System.out.println("搜索第一个年经大于 30 的人");      User user = list.stream().filter(u -> u.getAge() > 30).findFirst().get();      System.out.println(user);  } 

输出效果:

示例是必要先 filter 再 findFirst ,但倘若不要条件的话,filter 就不是必须的。

findAny(查找肆意一个)

查找 Stream 中的肆意一个元素,比如搜索 List<User> 荟萃中 肆意一个年经大于 30 的人:

/**   * 荟萃搜索肆意一个   * @author: 栈长   * @from: 公多号Java技术栈   */  @Test  public void findAny() {      System.out.println("搜索肆意一个年经大于 30 的人");      User user = list.stream().filter(u -> u.getAge() > 30).findAny().get();      System.out.println(user.getName());  } 

输出效果:

为什么效果和 findFirst 相通?和 findFirst 有什么不同呢?

findAny 是查找肆意一个元素,在串走流中倘若数据较少,清淡会返回第一个元素,但在并走流中它返回的效果就不确定了,它能够是流中的任何元素。

findAny 的方针是为了挑高并走流操作的性能,但倘若必要一个固定的效果,提出行使 findFirst。

anyMatch(肆意匹配)

查找 Stream 中的元素是否存在肆意匹配,比如搜索 List<User> 荟萃中 是否存在 XX 人:

/**   * 荟萃匹配肆意元素   * @author: 栈长   * @from: 公多号Java技术栈   */  @Test  public void anyMatch() {      System.out.println("是否存在 Jack:" + list.stream().anyMatch(u -> u.getName().contains("Jack")));      System.out.println("是否存在 Jet:" + list.stream().anyMatch(u -> u.getName().contains("Jet")));  } 

输出效果:

*Match 返回的效果是 boolean 类型。

noneMatch(空匹配)

查找 Stream 中的元素是否不存在匹配,比如搜索 List<User> 荟萃中 是否不存在 XX 人:

/**   * 荟萃不匹配肆意元素   * @author: 栈长   * @from: 公多号Java技术栈   */  @Test  public void noneMatch() {      System.out.println("是否不存在 Jack:" + list.stream().noneMatch(u -> u.getName().contains("Jack")));      System.out.println("是否不存在 Jet:" + list.stream().noneMatch(u -> u.getName().contains("Jack")));  } 

输出效果:

这个手段的作用就和 anyMatch 相逆。

allMatch(全匹配)

查找 Stream 中的元素是否通盘匹配,比如搜索 List<User> 荟萃中 一切人的年纪是否都大于 XX:

/**   * 荟萃匹配通盘元素   * @author: 栈长   * @from: 公多号Java技术栈   */  @Test  public void allMatch() {      System.out.println("一切人的年纪都大于3:" + list.stream().allMatch(u -> u.getAge() > 2));      System.out.println("一切人的年纪都大于30:" + list.stream().allMatch(u -> u.getAge() > 30));  } 

输出效果:

总结

以上一切搜索操作一走代码就能搞定,是不是很浅易优雅?

对于 List 之表的荟萃都能够转换为 List,再转换为 Stream 再进走搜索操作,对于 Stream,搜索简直就是幼儿科,你学废用了吗?

赶紧发给身边的同事望望吧,让你们的代码更优雅!

本文一切完善示例源代码已经上传:

https://github.com/javastacks/javastack

鸿蒙官方战略配相符共建——HarmonyOS技术社区


Powered by 2021十大排行最污直播-日韩4438x全国最大-十大污的软 @2018 RSS地图 HTML地图

Copyright 站群 © 2013-2021 365建站器 版权所有