1 Stream介绍
Stream
是Java 8
的新功能,是对集合(Collection)对象功能的增强,可以非常方便地对集合中的对象进行操作。
与Lambda
表达式结合,可以提高编程效率、代码的简洁性与可读性。Stream
流其实是一个集合元素的函数模型,
它并不是集合,也不是数据结构,其实本身并不存储任何元素Stream是一个来自数据源的元素队列。
注意:Stream
就如同一个迭代器,单向不可往复。
2 Stream方法
2.1 过滤
-
peek()
:帮助调试,允许无修改地查看流中的元素。 -
sorted()
:排序,可以传入Comparator
参数。 -
disrinct()
:消除流中的重复元素。 -
filter(Predicate)
:过滤操作则会留下使用过滤方法返回值为true
的元素。
2.2 应用函数到元素
-
map(Function)
:将原来流中的每个元素都调用参数里的方法,其返回值汇总起来产生一个新的流。 -
mapToInt(ToIntFunction)
:结果为IntStream
。 -
mapToLong(ToLongFunction)
:结果为LongStream
。 -
mapToDouble(ToDoubleFunction)
:结果为DoubleStream
。
2.3 结束操作
-
toArray()
:将流转换成适当类型的数组。 -
toArray(generator)
:在特殊情况下,生成器用于分配自定义的数组存储。 -
forEach(Consumer)
: 如使用System.out::println
作为函数。 -
forEachOrdered(Consumer)
:确保按照流的顺序执行。 -
parallel()
:可实现多处理器并行操作。实现原理是将流分割为多个(通常数目为 CPU 核心数)并在不同处理器上分别执行操作。而进行并行操作的时候,forEach
操作无法保证元素按原来的顺序输出,而forEachOrdered
则可以确保按原来的顺序输出。
2.4 收集流元素到集合
-
collection(Collector)
:使用Collector
收集流元素到集合中。 -
collect(Sipplier,BiConsumer,BiConsumer)
:收集流元素到结果集合中,第一个参数用于创建新的结果集合,第二个参数用于将下一个元素加入到现有结果集合中,第三个参数用于将两个结果合集合并。
2.5 匹配
-
allMatch(Predicate)
:如果流的每个元素根据提供的Predicate
都返回true
时,最终结果返回为true
。这个操作将会在第一个false
之后短路,也就是不会在发生false
之后继续执行计算。 -
anyMatch(Predicate)
:如果流中的任意一个元素根据提供的Predicate
返回true
时,最终结果返回为true
。这个操作将会在第一个true
之后短路,也就是不会在发生true
之后继续执行计算。 -
noneMatch(Predicate)
:如果流的每个元素根据提供的Predicate
都返回false
时,最终结果返回为true
。这个操作将会在第一个true
之后短路,也就是不会在发生true
之后继续执行计算。
2.6 查找元素
-
findFirst()
:返回一个含有第一个流元素的Optional
类型的对象,如果流为空返回Optional.empty
。 -
findAny()
:返回含有任意流元素的Optional
类型的对象,如果流为空返回Optional.empty
。
2.7 统计
-
average()
:求取流元素平均值 -
max()
和min()
:求元素的最大值和最小值,对于非数字流则要多一个Comparator
参数。 -
sum()
:对所有流元素进行求和。 -
count()
:流中的元素个数。
3 示例
public Map<Long, List<WorkSite>> testCase(List<Long> workSiteChoie) {
WorkSite workSite11 = new WorkSite(3L, "测试地点1", 120.32, 30.24,1.1);
WorkSite workSite12 = new WorkSite(3L, "测试地点2", 120.54, 31.44,2.0);
WorkSite workSite13 = new WorkSite(3L, "测试地点3", 121.42, 37.22,3.0);
WorkSite workSite21 = new WorkSite(2L, "测试地点4", 124.76, 31.10,4.0);
WorkSite workSite22 = new WorkSite(2L, "测试地点5", 130.17, 30.55,5.0);
WorkSite workSite23 = new WorkSite(2L, "测试地点6", 130.17, 30.55,6.0);
WorkSite workSite31 = new WorkSite(1L, "测试地点7", 130.17, 30.55,7.0);
WorkSite workSite32 = new WorkSite(1L, "测试地点8", 130.17, 30.55,8.0);
WorkSite workSite33 = new WorkSite(1L, "测试地点9", 130.17, 30.55,9.0);
List<WorkSite> workSites = Arrays.asList(workSite11, workSite12, workSite13, workSite21, workSite22,workSite23,
workSite31,workSite32,workSite33);
List<WorkSite> workSiteList = workSites.stream()
// 过滤掉ID为空的数据
.filter(workSite -> workSite.getId() != null)
// 去重
.distinct()
// 选择数据处理
.peek(workSite -> {
if (workSiteIds != null && workSiteIds.contains(workSite.getId())){
workSite.setChoose(true);
}
})
// 根据距离排序
.sorted(Comparator.comparing(WorkSite::getDistance))
.collect(Collectors.toList());
Map<Long, List<WorkSite>> collect = workSiteList.stream()
// 根据id分组
.collect(Collectors.groupingBy(WorkSite::getId));
collect.forEach((k,v)-> {
System.out.println("key : " + k + " value : " + v);
});
reture collect;
}