8个实用的Java Streams API

打印 上一主题 下一主题

主题 960|帖子 960|积分 2880

分享8个开箱即用的API,方便一样平常处理集合。
1. 快速过滤空值:Stream.ofNullable

该方法是在 Java 9 中引入的,有助于过滤集合中的所有空值,从而大概使我们克制空指针异常。
在下面的示例中,有一个包含 null 的List。此时,我们可以使用Stream.ofNullable方法对其进行过滤。
  1. List<String> names = Arrays.asList("Alice", null, "Bob", null, "Charlie");
  2. List<String> nonNuLLNames = names.stream()
  3.     .flatMap(Stream::ofNullable)
  4.     .collect(Collectors.toList());
  5. System.out.println(nonNuLLNames);
复制代码
实行上述代码,将输出:
  1. [Alice, Bob, Charlie]
复制代码
2. 流式迭代:Stream.iterate()

Stream.iterate()方法用于创建无限的序列流。它采用种子和一元函数,将函数应用于前一个元素。
在下面的例子中,我们的种子是0,一元运算函数是 n -> n+2。
  1. Stream.iterate(seed: 0, n -> n+2)
  2.     .Limit( maxsize: 10)
  3.     .forEach(e-> {
  4.         System,out printin(e)
  5.     });
复制代码
实行上述代码,将输出:
  1. 0
  2. 2
  3. 4
  4. 6
  5. 8
  6. 10
  7. 12
  8. 14
  9. 16
  10. 18
复制代码
注意:由于Stream.iterate()天生的是无限序列流。因此我们应该定义终止条件,比方:limit、findFirst 或 findAny 等,以克制无限循环。
3. 集合转换:collectingAndThen()

collectingAndThen()方法是在 Java 8 中引入的。它是一种特殊的网络器,允许您对另一个网络器的结果实行特殊类型的转换。
在下面的示例中,我们的网络器通过首先使用索引到大写操作进行映射,然后使该映射成为不可修改的Map进行转换。
  1. List<String> fruits = Arrays.asList("apple", "banana","orange");
  2. Map<Integer, String> result = fruits.stream()
  3.   .collect(Collectors.collectingAndThen(
  4.     Collectors.toMap(fruits::index0f,String::toUpperCase),
  5.     Collections::unmodifiableMap
  6.   ));
  7. System.out.println(result)
复制代码
实行上述代码,将输出:
  1. {0=APPLE, 1=BANANA, 2=ORANGE}
复制代码
4. 删除和截取:dropWhile()、takeWhile()

dropWhile()和takeWhile()方法是在 java9 中引入的,用于连续处理流。

  • takeWhile():返回符合条件的元素流
  • dropWhile():从元素流中删除符合条件的元素
在下面的示例中,我们删除小于3的元素,然后返回元素小于6的元素流。
  1. List<Integer> numbers = List.of(1,2,3,4,5,6,7);
  2. numbers.stream()
  3.   .dropWhile(n -> n < 3)
  4.   .takeWhile(n -> n < 6)
  5.   .forEach(System.out::println);
复制代码
实行上述代码,将输出:
  1. 3
  2. 4
  3. 5
复制代码
5. 整数流:IntStream

IntStream 在 Java 8 中引入,用于快速天生整数流,常用有的以下两个方法:

  • IntStream.range() 方法天生一个整数流,该整数流不包含结尾数字
  • IntStream.rangeClosed() 方法天生一个整数流,该整数流包含结尾数字
下面的例子,可以清晰的看到区别:
  1. // Prints 1,2,3,4
  2. IntStream.range(1,5).forEach(System.out::println);
  3. // Prints 1,2,3,4,5
  4. IntStream.rangeClosed(1,5).forEach(System.out::println);
复制代码
6. 应用多个网络器:teeing()

Java 12 中引入的teeing()方法是为了我们可以在元素流上一起应用两个单独的网络器而创建的。
在下面的示例中,我们使用teeing()计算元素流的最大值和最小值,然后将结果以Map形式返回。
  1. Stream<Integer> nums = Stream.of( ...values: 1 2,3 4);
  2. Map<String, Integer> collect = nums.collect(Collectors.teeing(
  3.   ColLectors.maxBy(Integer::compareTo),
  4.   CoLlectors.minBy(Integer::compareTo),
  5.   (e1, e2) -> Map.of( k1: "min", e1.get(), k2: "max", e2.get())
  6. ));
  7. System.out.println(collect);
复制代码
实行上述代码,将输出:
  1. {max=1, min=4}
复制代码
7. 合并流:Stream.concat()

Stream.concat()方法可以用来连接两个流并天生一个新流。
  1. Stream<Integer> stream1 = Stream.of(...values: 1,2,3);
  2. Stream<Integer> stream2 = Stream.of(...values: 4,5,6);
  3. Stream.concat(stream1, stream2)
  4.   .forEach(System.out::println);
复制代码
实行上述代码,将输出:
  1. 123
  2. 4
  3. 56
复制代码
8. 分组:Collectors.partitioningBy

Collectors.partitioningBy可以用来对流进行分组。
在下面的示例中,我们根据元素的字符串长度分为两个不同的组。
  1. Map<Boolean, List<String>> result1 = Stream.of(...values: "apple", "banana", "orange", "grape")
  2.   .collect(Collectors.partitioningBy(f -> f.length() > 5));
  3. System.out.println(result1);
复制代码
实行上述代码,将输出:
  1. {false=[apple, grape], true=[banana, orange]}
复制代码
本日的分享就到这里。假如您学习过程中如遇困难?可以到场我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步
接待关注我的公众号:程序猿DD。第一时间相识前沿行业消息、分享深度技术干货、获取优质学习资源

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表