写点什么

【Java 入门】流

用户头像
HQ数字卡
关注
发布于: 2020 年 12 月 22 日

集合是 Java 中使用最多的 API,几乎每个程序都会制造和处理集合。但是集合并不完美,比如对多核架构支持不好,我们常用流来提升处理效率。


流是什么

流是 Java API 中的一员,它允许你以声明性方式处理数据集合。流的一大特点是数据源本身是可以无限的。


流不是集合元素,并不保存数据,是用来计算的。


具有优点:

  • 声明性:使代码更加简洁,更加易读

  • 可复合:代码更加灵活

  • 可并行:利用服务器多核架构,性能更好


流操作

java.util.stream.Stream 中的 Stream 定义了许多操作。一般可以分为两类:

  • filter,map 和 limit 可以连成一条流水线。

  • collect 触发流水线执行并关闭它。

    List<String> strings = Arrays.asList("abc", "", "ss", "", "aa");    List<String> filtered = strings.stream().filter(s -> !s.isEmpty()).collect(Collectors.toList());        System.out.println(filtered);
复制代码


常用操作总结

  • 使用 filter,distinct,skip 和 limit 对流做筛选和切片


  • 使用 map 和 flatMap 提取或转换流中的元素。例子如下:

    List<Integer> numbers = Arrays.asList(1,2,3);    List<Integer> squareList = numbers.stream().map(i -> i * i).distinct().collect(Collectors.toList());
复制代码
  • 可以利用 reduce 方法将流中的所有元素迭代合并成一个结果。

    int sumValue = Stream.of(1, 2, 3, 4).reduce(0, Integer::sum);    System.out.println(sumValue);
复制代码


并行流

  • 并行流就是一个把内容分成多个数据块,并用不同的线程分别处理每个数据块的流。

  • 在 Java 8 中,并行流使用了默认的 ForkJoinPoll,它默认的线程数量就是你的处理器的数量。

    List<Integer> numbers = Arrays.asList(1,2,3);    List<Integer> squareList = numbers.parallelStream().map(i -> i * i).distinct().collect(Collectors.toList());
复制代码


总结

流已经出现很久了,但是在我接触到项目中使用的还不多,固然有老代码不愿意改的原因。如果新写的项目,大家不妨尝试一下,利用一下多核架构,使用一下新的 API 来完善自己的业务代码。


发布于: 2020 年 12 月 22 日阅读数: 29
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【Java入门】流