stream用法
stream主要是对集合的各种操作,极大的简化了编程,并且可读性非常强
stream流的数据源,可以是数组或集合,对于stream流的操作属于链式操作,也就是有中间操作和结尾操作
中间操作:如filter(),map(),limit()等,中间流的操作完成会生成一个新的流,以便进行后面的操作
结尾操作:如count(),allMatch(),collect()等
中间操作不会立马执行,等到结尾操作时同时执行
stream流的创建:
集合可以直接使用stream()和parallelStream()方法
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5,4,5,6,7);
List<Integer> stream1 = list.stream().collect(Collectors.toList());//串行流
List<Integer> stream2 = list.parallelStream().collect(Collectors.toList());并行流
数组可以用Arrays.stream()方法
Integer[] nums = new Integer[3];
Stream<Integer> stream = Arrays.stream(nums);
还可以使用Stream的of(),iterate(),generate()方法创建流
Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(5);
Stream<Double> stream3 = Stream.generate(Math::random).limit(5);
stream流的使用:
-
过滤
filter()方法,需要传入一个函数,这个函数需要返回布尔值,将布尔值为true的值筛选出来,
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5,4,5,6,7); List<Integer> collect = list.stream().filter(o -> o > 2).collect(Collectors.toList());
-
分页
skip()和limit()配合使用,skip()从多少个元素开始获取(从0开始),limit()获取多少个
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5,4,5,6,7); List<Integer> collect = list.stream().skip(1).limit(3).collect(Collectors.toList());
-
去重
distinct()方法,内部通过hashcode()和equals()方法实现去重
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5,4,5,6,7); List<Integer> collect = list.stream().distinct().collect(Collectors.toList());
-
映射
map()方法,接受一个函数,该函数会作用到流的每一个元素上面
flatMap()方法,接受一个函数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
List<String> list1 = Arrays.asList("aa/bb/cc", "dd/ee/ff"); Stream<String> stringStream = list1.stream().map(o -> o.replaceAll("/", ",")); list1.stream().flatMap(o->{ String[] split = o.split(","); Stream<String> s = Arrays.stream(split); return s; });
-
匹配
allMatch:接收一个函数,当流中每个元素都符合时才返回true,否则返回false
noneMatch:接收一个函数,当流中每个元素都不符合时才返回true,否则返回false
anyMatch:接收一个函数,只要流中有一个元素满足时则返回true,否则返回false
findFirst:返回流中第一个元素findAny:返回流中的任意元素
count:返回流中元素的总个数
max:返回流中元素最大值
min:返回流中元素最小值 -
组合
reduce()方法,主要作用是把 Stream 中的元素组合起来,其中reduce有两种用法,一种是没有初始值,一种是有初始值
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5,4,5,6,7); Integer v = list.stream().reduce((x1, x2) -> x1 + x2).get();//没有初始值 Integer v1 = list.stream().reduce(10, (x1, x2) -> x1 + x2);//有初始值
-
收集
collect()方法,可以将流转化成数组或者集合等
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5,4,5,6,7); List<Integer> collect = list.stream().filter(o -> o > 2).collect(Collectors.toList());
Collectors 是一个收集器的工具类,内置了一系列收集器实现,比如说 toList() 方法将元素收集到一个新的 java.util.List 中;比如说 toCollection()方法将元素收集到一个新的 java.util.ArrayList 中;比如说 joining()方法将元素收集到一个可以用分隔符指定的字符串中。