在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Java8 stream 学习1

2017-2-7 13:41| 发布者: zhangjf| 查看: 483| 评论: 0

摘要: 原文 http://renchx.com/java8-stream/ java8 当中引入的了流处理。引入流处理方便对集合进行处理,当我们想要遍历集合进行处理的时候可以使用 stram api 进行操作。 一个简单的例子:统计一个字符串集合当中 ...
原文 http://renchx.com/java8-stream/

java8 当中引入的了流处理。引入流处理方便对集合进行处理,当我们想要遍历集合进行处理的时候可以使用 stram api 进行操作。

一个简单的例子:统计一个字符串集合当中长度大于12的字符串的个数。

  1. List<String> words;//从某处获取
  2. int count = 0;
  3. for(String w : words) {
  4. if(w.length() > 12) {
  5. count++;
  6. }
  7. }
复制代码

如果使用 stram api 进行处理如下,简洁明了:
  1. List<String> words;//从某处获取
  2. int count = words.stream().filter( w -> w.length() > 12).count();
复制代码

stream 与集合的区别:

stream 自己不会存储元素 stream 不会改变原集合 stream 可能是延迟执行的

处理 stream 也可以并行,只需要方法修改成 words.parallelStream().filter( w -> w.length() > 12).count()

当我们使用 stream 的时候一般会有三个阶段来建立一个操作流水线。

创建 stream 在一个或者多个步骤当中,指定当初的 stream 转换成另外一个 stream 的中间操作 使用终止操作产生一个结果,该操作会强制延迟操作立即执行,并且这个 stream 就不可以继续使用。 创建 stream

创建 stream 如下:

  1. @Test
  2. public void createStream() {
  3. Stream<String> stream = Stream.of("a", "b");
  4. Stream<String> stream2 = Stream.empty();
  5. Stream<String> stream3 = Stream.generate(() -> "aaa");// generate方法生产一个无限的Stream
  6. Stream<Double> stream4 = Stream.generate(Math::random);
  7. Stream<BigInteger> stream5 = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE));// iterate方法生产一个无限的Stream
  8. }
复制代码

Stream.iterate 方法的第一个参数是一个种子,第二个参数是一个函数。所以 stream5 序列的第一个元素是 BigInteger.ZERO,第二个是相当于 f(BigInteger.ZERO) ,我们传递的函数就是add BigInteger.ONE,第三个元素是f(f(BigInteger.ONE));

stream 转换
  1. @Test
  2. public void streamTOstream() {
  3. Stream<String> stream = Stream.of("a", "b", "c", "da", "asdass");
  4. Stream<String> stream2 = stream.filter(n -> n.length() > 3);
  5. Stream<String> stream3 = stream.map(String::toUpperCase);// map方法是对每个元素操作传入的函数
  6. Stream<Stream<Character>> stream4 = stream.map(w -> characterStream(w));
  7. //上面的结果是[['a'],['b'],['c'],['d','a'],['a','s' ...]]
  8. //如果我们想获得所有单词的字符 Stream<Character> 这个可以使用 flatMap 方法
  9. Stream<Character> stream5 = stream.flatMap(w -> characterStream(w));
  10. //上面的结果是['a', 'b', 'c', 'd', 'd', ...]
  11. }
  12. public static Stream<Character> characterStream(String string) {
  13. List<Character> result = new ArrayList<Character>();
  14. for (char c : string.toCharArray()) {
  15. result.add(c);
  16. }
  17. return result.stream();
  18. }
复制代码

提取子流和组合流和就状态转换
  1. @Test
  2. public void streamTOstream2() {
  3. Stream<Double> stream1 = Stream.generate(Math::random).limit(100);
  4. Stream<Double> stream2 = Stream.generate(Math::random).limit(100);
  5. Stream<Double> stream3 = Stream.concat(stream1, stream2);
  6. Stream<String> stream = Stream.of("a", "b", "c", "da", "asdass", "b");
  7. Stream<String> streamA = stream.distinct();//去重
  8. Stream<String> streamB = stream.sorted(Comparator.comparing(String::length));//排序
  9. }
复制代码

【参考资料】

写给大忙人看的Java SE 8

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-9 10:30

Copyright 2015-2025 djqfx

返回顶部