流(Stream)
流是一种数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
操作流的步骤
-
创建
从一个数据源中,获取流。
-
中间操作
对流进行处理
-
终止操作
生成结果
创建流
-
通过Collection接口提供的stream和parallelStream方法
List<String> list = new ArrayList<>(); Stream<String> stringStream = list.stream(); Stream<String> stringParalleStream = list.parallelStream();
-
通过Arrays类提供的stream方法
Integer[] integers = new Integer[10]; Stream<Integer> integerStream = Arrays.stream(integers);
-
通过Stream接口中的静态方法of
Stream<String> stream = Stream.of("aa", "bb", "cc");
-
创建无限流
Stream<Integer> iterate = Stream.iterate(0, (x) -> x + 2); iterate.limit(10).forEach(System.out::println);
-
通过Stream接口中的静态方法generate
Stream.generate(() -> Math.random()).limit(5).forEach(System.out::println);
中间操作
筛选与切片
过滤(filter)
filter(i -> i > 5)
限制数量(limit)
// 短路
limit(5)
按顺序跳过(skip)
skip(1)
去重(distinct)
distinct()
映射
映射(map)
map(i -> i * i)
扁平化映射(flatMap)
List<String> stringList = Arrays.asList("cc", "aa", "bb","dd", "ee", "ff", "gg","hh","ii", "jj", "kk", "ll");
Stream<Character> characterStream = stringList.stream().flatMap(StreamApi::slipChar);
characterStream.forEach(System.out::println);
public static Stream<Character> slipChar(String string) {
List<Character> list = new ArrayList<>();
for (Character ch : string.toCharArray()) {
list.add(ch);
}
return list.stream();
}
排序
自然排序
stringList.stream()
.sorted()
.forEach(System.out::println);
定制排序
integerList.stream()
.sorted((x, y ) -> -Integer.compare(x, y))
.forEach(System.out::println);
终止操作
查找与匹配
匹配所有
boolean allMatch(Predicate<? super T> predicate);
匹配一个
boolean anyMatch(Predicate<? super T> predicate);
确认排除
boolean noneMatch(Predicate<? super T> predicate);
返回首元素
Optional<T> findFirst();
返回随机
Optional<T> findAny();
返回数量
long count();
返回最大值
// 传入比较器
Optional<T> max(Comparator<? super T> comparator);
返回最小值
// 传入比较器
Optional<T> min(Comparator<? super T> comparator);
归约与收集
归约
将流中的元素反复结合起来,得到一个值。
List<Integer> integerList = Arrays.asList(5, 6, 8, 8, 9, 10, 11 , 12, 7, 1, 4, 3, 2);
// 数列累加
Integer sum = integerList.stream()
// x=0, y=5
.reduce(0, (x, y) -> x+y);
System.out.println("sum:"+sum);
收集
将流转换为其他格式,接受一个Collector接口实现,用于给Stream中的元素做汇总方法。
List<String> stringList = Arrays.asList("cc", "aa", "bb","dd", "ee", "ff", "gg","hh","ii", "jj", "kk", "ll");
Stream<Character> characterStream = stringList.stream().flatMap(StreamApi::slipChar);
List<Character> characters = characterStream.collect(Collectors.toList());
characters.forEach(System.out::println);
Collectors工具类常用方法
- 求数量-counting
- 求平均-averagingDouble
- 累加-summingDouble
- 取最大值-maxBy(Comparator<? super T> comparator)
- 分组-groupingBy
- 分区-partitioningBy
- 连接-joining