在 Java 中,Stream 的中间操作用于对 Stream 中的元素进行处理、转换或筛选,但是它们不会触发 Stream 的处理。相反,它们会返回一个新的 Stream 对象,允许你在其后继续进行其他中间操作或终端操作。下面是一些常见的中间操作及其作用:
filter(Predicate):根据指定的条件过滤 Stream 中的元素,只保留满足条件的元素。
javaCopy codeList<String> fruits = Arrays.asList("apple", "banana", "cherry", "apricot", "blueberry");
List<String> filteredFruits = fruits.stream()
.filter(fruit -> fruit.startsWith("a"))
.collect(Collectors.toList());
// 结果:["apple", "apricot"]
map(Function):将 Stream 中的每个元素映射成另一个元素,可以是相同类型或不同类型的映射。
javaCopy codeList<Integer> lengths = fruits.stream()
.map(String::length)
.collect(Collectors.toList());
// 结果:[5, 6, 6, 7, 9]
flatMap(Function):将 Stream 中的每个元素映射成一个 Stream,然后将这些 Stream 合并成一个新的 Stream。
javaCopy codeList<String> words = Arrays.asList("hello", "world");
List<String> uniqueLetters = words.stream()
.flatMap(word -> Arrays.stream(word.split("")))
.distinct()
.collect(Collectors.toList());
// 结果:["h", "e", "l", "o", "w", "r", "d"]
sorted(Comparator):对 Stream 中的元素进行排序,默认按照自然顺序排序,也可以传入自定义的比较器。
javaCopy codeList<String> sortedFruits = fruits.stream()
.sorted()
.collect(Collectors.toList());
// 结果:["apple", "apricot", "banana", "blueberry", "cherry"]
distinct():去除 Stream 中重复的元素。
javaCopy codeList<String> distinctFruits = fruits.stream()
.distinct()
.collect(Collectors.toList());
// 结果:["apple", "banana", "cherry", "apricot", "blueberry"]
这些中间操作提供了丰富的功能,使得对 Stream 中的元素进行处理、转换或筛选变得非常方便。在中间操作之后,你可以继续链接其他的中间操作或者终端操作来完成更复杂的数据处理任务。