Java 8 Stream


Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

以上的流程转换为 Java 代码为:

List<Integer> transactionsIds =
widgets.stream().filter(b -> b.getColor() == RED).sorted((x,y) -> x.getWeight() - y.getWeight()).mapToInt(Widget::getWeight).sum();

什么是 Stream?

Stream(流)是一个来自数据源的元素队列并支持聚合操作

  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:

  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

生成流

在 Java 8 中, 集合接口有两个方法来生成流:

  • stream() − 为集合创建串行流。

  • parallelStream() − 为集合创建并行流。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());


forEach

Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数:

Random random = new Random(); random.ints().limit(10).forEach(System.out::println);


map

map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); // 获取对应的平方数 List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());


filter

filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // 获取空字符串的数量 long count = strings.stream().filter(string -> string.isEmpty()).count();


limit

limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:

Random random = new Random(); random.ints().limit(10).forEach(System.out::println);


sorted

sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println);


并行(parallel)程序

parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // 获取空字符串的数量 int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

我们可以很容易的在顺序运行和并行直接切换。


Collectors

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); System.out.println("筛选列表: " + filtered); String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", ")); System.out.println("合并字符串: " + mergedString);


统计

另外,一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics(); System.out.println("列表中最大的数 : " + stats.getMax()); System.out.println("列表中最小的数 : " + stats.getMin()); System.out.println("所有数之和 : " + stats.getSum()); System.out.println("平均数 : " + stats.getAverage());

Java 8 Stream:遍历、筛选、指定、排序、统计等相关推荐

  1. Java List Stream 遍历

    业务 List Stream在实际开发中的应用比较多,其中List的Stream遍历更是常用,下面介绍两种List遍历的写法 第一种,forEach方法 list.forEach(p -> p. ...

  2. Java的Stream流编程的排序sorted方法里参数o1,o2分别代表什么?

    先说结论:在sorted方法中,o1是最后面的元素,o2是倒数第二个元素,以此类推,流是处理元素是从后面开始取值. package com.br.itwzhangzx02.learn;import o ...

  3. Java集合如何遍历删除指定元素

    目录 1.删除List 2.删除Set 3.删除Map 注意事项: 1.删除List public class ListDemo {public static void main(String[] a ...

  4. 20 个超级使用的 Java 8 Stream,玩转集合的筛选、归约、分组、聚合

    先贴上几个案例,水平高超的同学可以挑战一下: 1. 从员工集合中筛选出salary大于8000的员工,并放置到新的集合里. 2. 统计员工的最高薪资.平均薪资.薪资之和. 3. 将员工按薪资从高到低排 ...

  5. java遍历之数组遍历,list遍历,set遍历,map遍历,stream遍历,Enumeration遍历

    1._遍历方式 其实遍历的就两种,对象和数组.只是哪个遍历适用于哪个而已 for for增强 foreach 迭代(Iterable) Arrays.toString 2._数组遍历 package ...

  6. 【Stream流】基础用法—求和、筛选、排序

    stream是java8的新特性,它可以代替for循环,可以加快代码运行速度,使用stream可以写出高效率.干净.简洁的代码. 下边直接讲stream的使用方法,前提是你已经获取到了list的数据( ...

  7. Java 8 Stream流 的用法

    Java 8 Stream流 什么是 Stream? Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列. Java中的Stream并不会存储元素,而是按需 ...

  8. Java 8 - Stream流骚操作解读

    文章目录 分类 中间操作 终端操作 使用Stream流 筛选和切片 用谓词筛选 filter 筛选各异的元素 distinct 截短流 limit 跳过元素 skip 映射 对流中每一个元素应用函数 ...

  9. Java 8 Stream 使用

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/106389071 本文出自[赵彦军的博客] 目录 1.基础概念 2.常见操作符 fi ...

最新文章

  1. 单片机外文参考文献期刊_论文参考文献|如何在最短时间内加注参考文献??...
  2. ug导出step文件失败_解决UG导出CAD图纸失败的问题
  3. ebs和java哪个前景好_EBS与实例存储的好处(反之亦然)[关闭]
  4. mysql一对多代码_MySQL实现一对多查询的代码示例
  5. python随机数比大小_1到范围内的随机数系统最大大小总是1模2^10
  6. P1090-合并果子【离散化,队列,时间复杂度O(n)】
  7. 如果再出恶性安全事件,滴滴会有人被追究刑责吗?
  8. ftk学习记(button篇)
  9. 万元奖金 , 百万流量 , 助你成为CSDN超级红人 !
  10. 电脑无限重启rpc服务器不可用,StarUML启动时候出现System Error. Code:1722. RPC服务器不可用.错误的解决办法...
  11. \Process(sqlservr)\% Processor Time 计数器飙高
  12. 微信内置浏览器不支持 onclick 如何解决?(原因是因为内面中的内容或者标签大部分是动态生成的)...
  13. 典型相关分析(CCA)简述
  14. python:批量修改文件夹名称
  15. (二)java项目中的文档转换案例实战——PDF转换为JPG图片压缩包
  16. 软件架构风格-调用/返回风格
  17. win7找不到win10计算机图标,win7电脑桌面图标不见了怎么办
  18. html怎么设置网页的大小怎么设置,css怎么设置字体大小
  19. 浅谈大数据领域的云计算
  20. 简单的jq实现树形菜单

热门文章

  1. 协会的会员单位宝付,受邀参加支付清算法务培训班
  2. SIP INVITE流程
  3. mysql物流管理系统_物流配送管理系统(ssm,mysql)
  4. asp制作显IP图片
  5. 指定城市|日度空气质量数据爬虫【附代码】
  6. Linux tricks
  7. iOS - postgetAFNetworking
  8. 智慧停车场行业室外停车场实用价值
  9. Altium Designer 21的使用(二):电阻电容模型的创建
  10. 如何找回U盘清理了的文件