0、什么是流
Stream(流)是一个来自数据源的元素队列并支持聚合操作
1、生成流
在 Java 8 中, 集合接口有两个方法来生成流:
-
stream() − 为集合创建串行流。
-
parallelStream() − 为集合创建并行流。
2、流操作的类型
中间操作:返回结果还是流。
终端操作:返回结果是可操作的集合。
3、中间操作:返回流
forEach遍历
不返回结果
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//打印
list.stream().forEach(System.out::println);
filter:过滤
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//过滤
Stream<Integer> integerStream = list.stream().filter(x -> x > 5);
//打印
integerStream.forEach(System.out::println);
map:映射
map 方法用于映射每个元素到对应的结果
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//映射
Stream<Integer> integerStream = list.stream().map(x -> 20 * x);
//打印
integerStream.forEach(System.out::println);
limit:获取指定数量的流
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//获取前几个元素
Stream<Integer> integerStream = list.stream().limit(5);
//打印
integerStream.forEach(System.out::println);
sorted:对流进行排序(默认正序)
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//倒序
Stream<Integer> integerStream = list.stream().sorted(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
//打印
integerStream.forEach(System.out::println);
skip(long n):跳过除前 n 个元素
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//跳过
Stream<Integer> integerStream = list.stream().skip(5);
//打印
integerStream.forEach(System.out::println);
distinct:去除重复元素
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 6, 6, 7, 8, 9, 10);
//
Stream<Integer> res = list.stream().distinct();
//打印
res.forEach(System.out::println);
4、终端操作
anyMatch:至少一个满足条件
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//跳过
boolean res = list.stream().anyMatch(x->x>5);
//打印
System.out.println(res);
allMatch:全部满足条件
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//跳过
boolean res = list.stream().allMatch(x->x>5);
//打印
System.out.println(res);
noneMatch:都不符合条件
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//
boolean res = list.stream().noneMatch(x->x>5);
//打印
System.out.println(res);
findAny():找到其中一个元素
使用 stream() 时找到的是第一个元素;使用 parallelStream() 并行时找到的是其中一个元素
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//
Optional<Integer> res = list.stream().findAny();
//打印
System.out.println(res.get());
findFirst():找到第一个元素
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//
Optional<Integer> res = list.stream().findFirst();
//打印
System.out.println(res.get());
reduce
用于组合流中的元素,如求和,求积,求最大值等,还有价格计算时我们的类型是BigDecimal类型
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
//
Optional<Integer> res = list.stream().reduce((result,item)->result+item);
//打印
System.out.println(res.get());
collect:返回列表或字符串
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 6, 6, 7, 8, 9, 10);
//
List<Integer> res = list.stream().collect(Collectors.toList());
//打印
res.forEach(System.out::println);