Stream API
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
Stream(流)是一个来自数据源的元素队列并支持聚合操作
元素:特定类型的对象,形成一个队列。
数据源:流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
聚合操作:类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
Pipelining:中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。
一、多条件排序
sorted() − 用于对流进行排序。
通过查阅资料,发现有两种逆序排序方法:
1.Comparator.comparing(类::属性).reversed(); // 先得到.Comparator.comparing的排序结果,再逆序(两步)
2.Comparator.comparing(类::属性,Comparator.reverseOrder()); // 直接进行目标排序(一步到位)
较为推荐使用第二种方法进行排序,简单易懂
方法1.Comparator.comparing(类::属性).reversed():
1.先根据 条件1[正序]、再根据 条件2[正序]
list.sort(Comparator.comparing(Entity:getOrderNumber)
.thenComparing((Entity::getTime)));
2.先根据 条件1[逆序]、再根据 条件2[正序]
list.sort(Comparator.comparing(Entity:getOrderNumber).reversed()
.thenComparing((Entity::getTime)));
先根据条件一升序,升序结果进行逆序。再进行条件二升序。
3.先根据 条件1[逆序]、再根据 条件2[逆序]
list.sort(Comparator.comparing(Entity:getOrderNumber)
.thenComparing((Entity::getTime)).reversed());
先根据条件一升序,在根据条件二升序,再对结果进行逆序。
4.先根据 条件1[正序]、再根据 条件2[逆序]
list.sort(Comparator.comparing(Entity:getOrderNumber).reversed()
.thenComparing((Entity::getTime).reversed());
先根据条件一升序,升序结果逆序。再进行条件二升序,将升序结果逆序。
方法2.Comparator.comparing(类::属性,Comparator.reverseOrder());
2.先根据 条件1[逆序]、再根据 条件2[正序]
list.sort(Comparator.comparing(Entity:getOrderNumber,Comparator.reverseOrder())
.thenComparing((Entity::getTime)));
先根据条件一降序。再进行条件二升序。
3.先根据 条件1[逆序]、再根据 条件2[逆序]
list.sort(Comparator.comparing(Entity:getOrderNumber.reverseOrder()).thenComparing()(Entity::getTime.reverseOrder()));
先根据条件一降序。再进行条件二降序。
4.先根据 条件1[正序]、再根据 条件2[逆序]
list.sort(Comparator.comparing(Entity:getOrderNumber).thenComparing()(Entity::getTime.reverseOrder()));
先根据条件一升序。再进行条件二逆序。
二、list转map
stream() − 为集合创建串行流。
Collectors 类 − 实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串
Map<Integer, EntityVO> voMap = list.stream().collect(Collectors.toMap(EntityVO::getId, EntityVO-> EntityVO));
三、其他常用方法
1.forEach() - 循环遍历
2.map() - 用于映射每个元素到对应的结果
3.filter() - 用于通过设置的条件过滤出元素
4.limit() - 用于获取指定数量的流。
5.parallelStream() - 是流并行处理程序的代替方法
6.IntSummaryStatistics - 产生int、double、long等基本类型的统计结果