发布网友 发布时间:2024-09-30 14:53
共1个回答
热心网友 时间:2024-10-18 00:38
介绍在写算法题的时候,经常看见其他人对数组或者列表进行操作的时候没有去手动遍历一遍进行操作,而是优雅地用一行代码就能解决。如对一个列表中的所有数排序并取平方:
nums=nums.stream().sorted().map(i->i*i).collect(Collectors.toList())这便是java8的特性——Stream,这是java8提供的一个抽象概念,能让我们像上面的代码一样声明式地去处理数据。
具体来说就是,它将要处理的元素(数组或列表中的元素)看成是一种流,将这种流在管道中进行处理,比如排序、过滤等等,串行地执行这些操作,最终再通过collect将流转化为原来的数据形式或者变成其他的数据形式。
操作具体地,我们来讨论流中有那些操作。
排序就是对元素进行排序,如
List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);System.out.println(nums.stream().sorted().collect(Collectors.toList()));结果为
[1,2,5,6,7,8,10]
过滤根据设置的条件来过滤掉某些不要的元素,如这里只要过滤出小于等于5的元素:
List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);System.out.println(nums.stream().filter(i->i<=5).collect(Collectors.toList()));结果为
[5,2,1]
*数量用于获取指定数量的流,如这里只要5个元素:
List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);System.out.println(nums.stream().limit(5).collect(Collectors.toList()));结果为
[10,5,8,2,6]
映射映射每个元素到对应的结果上,像函数一样,如这里取平方:
List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);System.out.println(nums.stream().map(i->i*i).collect(Collectors.toList()));结果为
[100,25,64,4,36,1,49]
并行除了一般的串行处理,流还能并行地处理数据。只需简单地替换stream()为parallelStream()即可。
这里的并行我思考过是在每个操作的时候处理每个数据时并行,还是针对整个管道,每个操作并行处理。后者显然串行和并行结果会有所不同。经过实验,我发现是前者,即在每个操作的时候处理每个数据时并行。所以每个操作之间的执行还是串行执行的。
List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);//先过滤再映射System.out.println(nums.parallelStream().filter(i->i<=5).map(i->i*i).collect(Collectors.toList()));//先映射再过滤System.out.println(nums.parallelStream().map(i->i*i).filter(i->i<=5).collect(Collectors.toList()));结果为
[25,4,1][4,1]Collectors这个操作就是把流转化为原来的数据形式或者变成其他的数据形式,不仅可以转化回集合,更可以将结果聚合为一个元素,例子如下:
List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);//转化为列表System.out.println(nums.stream().filter(i->i<=5).map(i->i*i).collect(Collectors.toList()));//聚合成一个元素System.out.println(nums.stream().filter(i->i<=5).map(i->i*i).map(String::valueOf).collect(Collectors.joining("-")));结果为
[25,4,1]25-4-1除此之外,jdk还提供许多Collector供开发者使用,并且还可以自定义Collector。由于这里只是入门就不多赘述。
统计主要用于数值型元素上,可以方便地获得一些最大最小值、平均值等统计结果。
List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);IntSummaryStatisticsstats=nums.stream().mapToInt((x)->x).summaryStatistics();System.out.println(stats);System.out.println("最大值:"+stats.getMax());System.out.println("最小值:"+stats.getMin());System.out.println("平均数:"+stats.getAverage());System.out.println("所有元素之和:"+stats.getSum());结果为
List<Integer>nums=Arrays.asList(10,5,8,2,6,1,7);System.out.println(nums.stream().sorted().collect(Collectors.toList()));0总结这篇文章就是对Stream特性的一个入门探索,关于它其实还有很多内容,自定义程度非常的高,不过了解本文这些基本的操作与流式思想就基本够用在一些简单应用上了。