Stream用的时候老是忘记,特此记录一下。
Stream是Java 8引入的一组 API,它提供了一种新的并行处理集合数据的方式,可以让开发者更加方便、高效地对集合进行操作。
Stream用法:
filter(Predicate<T> predicate)
:根据指定的条件筛选元素。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
// 输出:[2, 4]
map(Function<T, R> mapper)
:将元素转换为另一种类型。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<String> result = list.stream().map(n -> "Number: " + n).collect(Collectors.toList());
// 输出:["Number: 1", "Number: 2", "Number: 3", "Number: 4", "Number: 5"]
flatMap(Function<T, Stream<R>> mapper):将流中的每个元素转换为一个流,然后将所有流合并为一个流。
List<List<Integer>> lists = Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3, 4, 5));
List<Integer> result = lists.stream().flatMap(list -> list.stream()).collect(Collectors.toList());
// 输出:[1, 2, 3, 4, 5]
distinct()
:去除流中重复的元素。
List<Integer> list = Arrays.asList(1, 2, 3, 2, 4, 1, 5);
List<Integer> result = list.stream().distinct().collect(Collectors.toList());
// 输出:[1, 2, 3, 4, 5]
sorted()
:对流中元素进行排序。
List<Integer> list = Arrays.asList(5, 3, 1, 2, 4);
List<Integer> result = list.stream().sorted().collect(Collectors.toList());
// 输出:[1, 2, 3, 4, 5]
peek(Consumer<T> action)
:对流中的元素执行指定的操作。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().peek(n -> System.out.println("Processing element: " + n)).collect(Collectors.toList());
// 输出:Processing element: 1 Processing element: 2 Processing element: 3 Processing element: 4 Processing element: 5
limit(long maxSize)
:截取流中的前N个元素。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().limit(3).collect(Collectors.toList());
// 输出:[1, 2, 3]
skip(long n)
:跳过流中的前N个元素。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().skip(3).collect(Collectors.toList());
// 输出:[4, 5]
forEach(Consumer<T> action)
:对流中的每个元素执行指定的操作。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().forEach(n -> System.out.println(n));
// 输出:1 2 3 4 5
collect(Collector<T, A, R> collector)
:将流中的元素收集到一个容器中。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
// 输出:[2, 4]
count()
:返回流中的元素个数。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
long count = list.stream().count();
// 输出:5
reduce(T identity, BinaryOperator<T> accumulator)
:将流中的元素逐个与初始值进行操作,返回最终结果。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().reduce(0, (a, b) -> a + b);
// 输出:15
findFirst()
和findAny()
:返回流中的第一个元素或任意一个元素。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> first = list.stream().findFirst();
Optional<Integer> any = list.stream().findAny();
// 输出:1
max()
和min()
:返回流中的最大元素或最小元素。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> max = list.stream().max(Integer::compareTo);
Optional<Integer> min = list.stream().min(Integer::compareTo);
// 输出:5 1
allMatch(Predicate<T> predicate)
、anyMatch(Predicate<T> predicate)
和noneMatch(Predicate<T> predicate)
:分别返回流中所有元素是否满足指定条件、是否至少有一个元素满足指定条件、是否没有元素满足指定条件。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
boolean allMatch = list.stream().allMatch(n -> n > 0);
boolean anyMatch = list.stream().anyMatch(n -> n % 2 == 0);
boolean noneMatch = list.stream().noneMatch(n -> n > 5);
// 输出:true true false
Stream 是基于管道(Pipe)和过滤器(Filter)的模式,通过对数据源执行一系列中间操作(Intermediate Operations)和终端操作(Terminal Operations)来完成对数据的处理。
利用 Stream API,我们可以在不改变原有数据结构的前提下,方便地进行数据的筛选、排序、映射、聚合等操作,并且这些操作可以串行或并行地执行,以提高计算效率。
总结常用 API
- filter(按照条件过滤需要数据)
- max(取出流中的最大值)
- min(取出流中的最小值)
- count(取出流中的数量)
- sum(取出流中数据的和)
- average(取出流中数据的平均值)
- distinct(将流中的数据去重)
- sorted(自然排序,默认为升序,可以设置为升序排序或者降序排序)
- limit,skip (限制和跳过:可以将流数据的部分截取,可用于后台的分页场景)
- map(映射转换)
- collect,toList(不可以对集合去重)
- collect, toSet(可以集合去重)
- toArray(将流数据转为数组)
- mapToInt,distinct(将流数据转成IntStream,并去重)
- reduce 求和
- reduce 求最大值
- reduce 求最小值
- reduce 求乘积
- findFirst(查找第一个元素)
- findAny(任意查找一个元素)
- allMatch(判断是否全部满足条件,全部满足返回 true,否则返回false)
- anyMatch(判断是否有一个满足条件,只要有一个满足就返回 true,否则都不满足返回false)
- noneMatch(判断是否都不满足条件,都不满足返回true,否则返回false)
- flatmap(扁平化流处理)
本文参考引用: