Java中stream流及Collectors的常见用法详细汇总!!!
目录
1. Stream流的优势
2. 常用用法
2.1 中间操作
2.1.1filter()
2.1.2 map()
2.1.3 sorted()
2.1.4 distinct()
2.1.5 limit()
2.1.6 skip()
2.2 终端操作
2.2.1 foreach()
2.2.2 collect()
2.2.3 reduce()
2.2.4 count()
2.2.5 anyMatch()
2.3 查找和匹配
2.3.1 findFirst()
2.3.2 findAny()
2.3.3 allMatch()
2.3.4 noneMatch()
2.4 映射与连接
2.4.1 flatMap()
2.4.2 mapToInt(), maToLong(), mapToDouble()
2.5 其他方法
2.5.1 forEachOrdered()
2.5.2 min()和max()
3. Collectors
3.1 Collectors常见用法
3.1.1 将流元素收集为列表(List)
3.1.2 将流元素收集为集合(Set)
3.1.3 将流元素收集为指定集合类型
3.1.4 将流元素收集为映射(Map)
3.1.5 将流元素进行分组
3.1.6 将流元素进行分区
3.1.7 将流元素进行汇总统计
3.1.8 将流元素连接成字符串
3.1.9 将流元素收集为不可变集合
1. Stream流的优势
- 简洁性和可读性:通过链式调用,Stream API使代码更加简洁易懂,减少了传统循环和条件判断的使用。
- 并行处理:通过
parallelStream()
,可以轻松实现并行化数据处理,从而充分利用多核处理器的性能。 - 惰性求值:Stream中的中间操作只有在终端操作触发时才会执行,避免了不必要的计算。
2. 常用用法
2.1 中间操作
中间操作会返回一个新的Stream,并且是惰性求值的(即不会立即执行,直到遇到终端操作)。这些操作通常被用于过滤、映射和排序等任务。
2.1.1filter()
用于根据指定的条件筛选流中的元素。然会一个只包含满足条件的元素的流
语法如下:
Stream<T> filter(Predicate<? super T> predicate)
示例代码如下:
List<String> names = Arrays.asList("Java", "Stream", "API", "Code");
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("J"))
.collect(Collectors.toList()); // 输出: [Java]
2.1.2 map()
将流中的每一个元素以后应用一个函数,并将结果收集到一个新的流中。常用对象属性的提取或数据转换。
语法如下:
<R> Stream<R> map(Function<? super T, ? extends R> mapper)
实例如下:
List<String> words = Arrays.asList("Java", "Stream", "API");
List<Integer> wordLengths = words.stream()
.map(String::length)
.collect(Collectors.toList()); // 输出: [4, 6, 3]
2.1.3 sorted()
对流中的元素进行排序。可以不带参数(自然排序),也可以传入comparator来自定义排序规则。(定制排序,可以看一下我上一篇博客)
语法如下:
Stream<T> sorted()
Stream<T> sorted(Comparator<? super T> comparator)
示例如下:
List<Integer> numbers = Arrays.asList(5, 3, 9, 1);
List<Integer> sortedNumbers = numbers.stream()
.sorted()
.collect(Collectors.toList()); // 输出: [1, 3, 5, 9]
2.1.4 distinct()
去除流中的重复元素。通过equals()方法比较元素是否相同。
语法如下:
Stream<T> distinct()
示例如下:
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList()); // 输出: [1, 2, 3]
2.1.5 limit()
限制流中元素的数量,返回前n个元素
如法如下:
Stream<T> limit(long maxSize)
示例如下:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
.limit(3)
.collect(Collectors.toList()); // 输出: [1, 2, 3]
2.1.6 skip()
跳过流中的前n个元素,然后返回剩下的元素
语法如下:
Stream<T> skip(long n)
示例如下:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
.skip(2)
.collect(Collectors.toList()); // 输出: [3, 4, 5]
2.2 终端操作
终端操作会触发Stream流的实际处理,并产生一个结果。常见的终端操作有收集数据、计算汇总值和执行遍历等。
2.2.1 foreach()
对流中的每个元素执行指定的动作,一般用于便利流元素。
语法如下:
void forEach(Consumer<? super T> action)
示例如下:
List<String> names = Arrays.asList("Java", "Stream", "API");
names.stream().forEach(Syste