目录
Stream简介
- Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
- 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
可以看出Stream主要是用于集合的,使用Stream能帮助我们在使用集合的使后更有效率。流可以看作溪水,从A容器流向B容器,在流动的过程中可以对其进行操作。
Stream方法使用
stream()/collect()方法
分别是 ‘将集合转换为流’/‘将流解析为集合’
List<Integer> arr = Arrays.asList(1,2,3,4);
//将集合转换为流
Stream<Integer> stream = arr.stream();
//.....在此就可以对流进行操作了
//将流解析为集合
List<Integer> collect = stream.collect(Collectors.toList());
//可以简化为
List<Integer> collect1 = arr.stream().collect(Collectors.toList());
filter()方法
用于对集合进行过滤。如只保留集合{1,2,3,4,0}中大于2的元素。
使用stream实现
//stream将arr转成流,filter(如果返回true保留,false丢弃),collect在将流转换为列表
List<Integer> collect = arr.stream().filter(e -> e > 2).collect(Collectors.toList());
使用for实现
List<Integer> arr = Arrays.asList(1,2,3,4);
List<Integer> res = new ArrayList<>();
for (Integer integer : arr) {
if(integer > 2)
res.add(integer);
}
map()方法
map()是一个key:value操作,将一个数映射为其它数。如果将集合{1,2,3,4}生成新的集合,每个元素+2,
List<Integer> list = Arrays.asList(1, 2, 3, 4);
//map将e映射成为了e+2
List<Integer> collect = list.stream().map(e -> e + 2).collect(Collectors.toList());
limit()方法
limil(n) 只保留流中前n个元素,如只保留列表{1,2,3,4}前两个元素
List<Integer> list = Arrays.asList(1, 2, 3, 4);
List<Integer> collect = list.stream().limit(2).collect(Collectors.toList());
forEach()
Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。以下代码片段遍历一个数组:
List<Integer> arr = Arrays.asList(1,2,3,4);
arr.forEach(System.out::println);
===>
1
2
3
4
sorted()排序
给集合的排序,是跟常用的功能,下边演示对集合的操作
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
Comparator<Integer> comparator = new Comparator<Integer>() {
//t是当前的,t1是上一个 返回>0递增,<0递减
@Override
public int compare(Integer t, Integer t1) {
System.out.println(t+"::"+t1);
return t-t1;
}
};
numbers.stream().sorted(comparator).forEach(System.out::println);
===>
2
2
3
3
3
5
7
统计
另外,一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上,它们可以用来产生类似如下的统计结果。
List<Integer> numbers2 = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = numbers2.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());
===>
列表中最大的数 : 7
列表中最小的数 : 2
所有数之和 : 25
平均数 : 3.5714285714285716
并行程序
List<String> strings1 = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量 层使用Fork/Join框架实现。简单理解就是多线程异步任务的一种实现。
//并行流
List<String> count = strings1.parallelStream().filter(string1 -> !string1.isEmpty()).collect(Collectors.toList());
count.forEach(System.out::println);