玩转 Java 8 的 Stream 和 Collectors 工具类
1、Java 8 的流式编程
- 流(Stream) 是一系列与特定存储机制无关的元素,实际上流并没有"存储"之说。利用流,我们无需迭代集合中的元素,就可以提取和操作它们。
- 操作流(Stream)的一个核心好处就是,它使得程序更加短小并且更易于理解。尤其是当Lambda表达式和流一起使用的时候,会让人感觉自成一体,可读性更高。
2、创建流的几种方法
-
通过 Stream.of() 将一组元素转化成为流。
-
通过 Stream.iterate() 创建流。
-
Java8 中,集合接口有以下几个方法生成流 :
stream() : 为集合创建串行流。
parallelStream() : 为集合创建并行流。
3、操作流的详细方法
方法 | 说明 |
---|---|
forEach() |
迭代流中的每个数据。 |
map() |
映射每个元素到对应的结果。 |
filter() |
通过设置的条件过滤出元素。 |
limit(n) |
获取指定数量的流,有顺序关系。 |
sorted() |
对流进行排序。 |
distinct() |
通过流中元素的 hashCode() 和 equals() 去除重复元素。 |
skip(n) |
跳过n元素,有顺序关系。 |
max() |
寻找流中最大的元素。 |
min() |
寻找流中最小的元素。 |
count() |
返回流中元素的总个数。 |
findFirst() |
返回流中第一个元素。 |
findAny() |
返回流中的任意元素。 |
allMatch() |
Stream 中全部元素符合传入的 predicate,返回 true |
anyMatch() |
Stream 中只要有一个元素符合传入的 predicate,返回 true |
noneMatch() |
Stream 中没有一个元素符合传入的 predicate,返回 true |
collect() |
将流转为集合。 |
注: 使用skip(n)和limit(n)组合可实现分页(该方式对数据库的压力没有减轻,只是对集合做了截取)。
3.1、遍历:forEach()
3.2、映射:map()
3.3、过滤:filter()
3.4、分片去重:limit、skip、distinct
3.5、排序:sorted()
自然排序
定制排序:sorted(Comparator com),自定义Comparator排序器。
3.6、最大 / 最小 / 总数:max / min / count
3.7、取第一个 / 任意一个:findFirst / findAny
3.8、匹配:allMatch / noneMatch / anyMatch
4、Collector 工具库:Collectors
4.1、分组:groupingBy
4.2、拼接:joining
4.3、聚合:max \ min \ sum \ avg \ count
4.4、分区:partitioningBy
4.5、规约:reducing
.