Java 8 Stream:遍历、筛选、指定、排序、统计等
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:遍历、筛选、指定、排序、统计等相关推荐
- Java List Stream 遍历
业务 List Stream在实际开发中的应用比较多,其中List的Stream遍历更是常用,下面介绍两种List遍历的写法 第一种,forEach方法 list.forEach(p -> p. ...
- Java的Stream流编程的排序sorted方法里参数o1,o2分别代表什么?
先说结论:在sorted方法中,o1是最后面的元素,o2是倒数第二个元素,以此类推,流是处理元素是从后面开始取值. package com.br.itwzhangzx02.learn;import o ...
- Java集合如何遍历删除指定元素
目录 1.删除List 2.删除Set 3.删除Map 注意事项: 1.删除List public class ListDemo {public static void main(String[] a ...
- 20 个超级使用的 Java 8 Stream,玩转集合的筛选、归约、分组、聚合
先贴上几个案例,水平高超的同学可以挑战一下: 1. 从员工集合中筛选出salary大于8000的员工,并放置到新的集合里. 2. 统计员工的最高薪资.平均薪资.薪资之和. 3. 将员工按薪资从高到低排 ...
- java遍历之数组遍历,list遍历,set遍历,map遍历,stream遍历,Enumeration遍历
1._遍历方式 其实遍历的就两种,对象和数组.只是哪个遍历适用于哪个而已 for for增强 foreach 迭代(Iterable) Arrays.toString 2._数组遍历 package ...
- 【Stream流】基础用法—求和、筛选、排序
stream是java8的新特性,它可以代替for循环,可以加快代码运行速度,使用stream可以写出高效率.干净.简洁的代码. 下边直接讲stream的使用方法,前提是你已经获取到了list的数据( ...
- Java 8 Stream流 的用法
Java 8 Stream流 什么是 Stream? Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列. Java中的Stream并不会存储元素,而是按需 ...
- Java 8 - Stream流骚操作解读
文章目录 分类 中间操作 终端操作 使用Stream流 筛选和切片 用谓词筛选 filter 筛选各异的元素 distinct 截短流 limit 跳过元素 skip 映射 对流中每一个元素应用函数 ...
- Java 8 Stream 使用
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/106389071 本文出自[赵彦军的博客] 目录 1.基础概念 2.常见操作符 fi ...
最新文章
- 单片机外文参考文献期刊_论文参考文献|如何在最短时间内加注参考文献??...
- ug导出step文件失败_解决UG导出CAD图纸失败的问题
- ebs和java哪个前景好_EBS与实例存储的好处(反之亦然)[关闭]
- mysql一对多代码_MySQL实现一对多查询的代码示例
- python随机数比大小_1到范围内的随机数系统最大大小总是1模2^10
- P1090-合并果子【离散化,队列,时间复杂度O(n)】
- 如果再出恶性安全事件,滴滴会有人被追究刑责吗?
- ftk学习记(button篇)
- 万元奖金 , 百万流量 , 助你成为CSDN超级红人 !
- 电脑无限重启rpc服务器不可用,StarUML启动时候出现System Error. Code:1722. RPC服务器不可用.错误的解决办法...
- \Process(sqlservr)\% Processor Time 计数器飙高
- 微信内置浏览器不支持 onclick 如何解决?(原因是因为内面中的内容或者标签大部分是动态生成的)...
- 典型相关分析(CCA)简述
- python:批量修改文件夹名称
- (二)java项目中的文档转换案例实战——PDF转换为JPG图片压缩包
- 软件架构风格-调用/返回风格
- win7找不到win10计算机图标,win7电脑桌面图标不见了怎么办
- html怎么设置网页的大小怎么设置,css怎么设置字体大小
- 浅谈大数据领域的云计算
- 简单的jq实现树形菜单