java8中stream().map().collect()的Collectors.toList()、Collectors.toMap()、Collectors.groupingBy()方法简介
下文笔者讲述stream中常见的map方法,如下所示
-`Collectors.tolist()`: 将流中的元素收集到一个 `List` 中。 -`Collectors.toMap()`: 将流中的元素收集到一个 `Map` 中, 需要提供键和值的映射函数, 并可选地提供合并函数来处理键冲突。 -`Collectors.groupingBy()`**: 按照某个条件将流中的元素分组,生成一个 `Map`, 其中键是分组条件的结果,值是符合该条件的元素列表。 可以使用下游收集器进一步处理分组后的结果
1.`Collectors.toList()`
功能 `Collectors.toList()` 用于将流中的元素收集到一个`List`中 方法签名 public static <T> Collector<T, ?, List<T>> toList()例
import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class ToListExample { public static void main(String[] args) { // 创建一个 Stream Stream<String> stream = Stream.of("Apple", "Banana", "Cherry"); // 使用 Collectors.toList() 将 Stream 转换为 List List<String> list = stream.collect(Collectors.toList()); // 输出 List System.out.println("List: " + list); } } ====输出结果 List: [Apple, Banana, Cherry]
2.`Collectors.toMap()`
Collectors.toMap()方法的功能
`Collectors.toMap()` 用于将流中的元素收集到一个`Map`中 需要提供两个函数: 一个用于生成键 另一个用于生成值 方法签名 public static <T, K, U> Collector<T, ?, Map<K, U>> toMap( Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper)例
import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; public class ToMapExample { public static void main(String[] args) { // 创建一个 Stream Stream<String> stream = Stream.of("Apple", "Banana", "Cherry"); // 使用 Collectors.toMap() 将 Stream 转换为 Map Map<String, Integer> map = stream.collect(Collectors.toMap( s -> s, // 键:字符串本身 String::length // 值:字符串的长度 )); // 输出 Map System.out.println("Map: " + map); } } ====输出结果==== Map: {Apple=5, Banana=6, Cherry=6}
注意事项
处理键冲突 如果流中有重复的键 `Collectors.toMap()` 会抛出 `IllegalStateException` 可以通过提供一个合并函数来处理键冲突。
import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; public class ToMapWithMergeExample { public static void main(String[] args) { // 创建一个 Stream Stream<String> stream = Stream.of("Apple", "Banana", "Cherry", "Berry"); // 使用 Collectors.toMap() 并处理键冲突 Map<Integer, String> map = stream.collect(Collectors.toMap( String::length, // 键:字符串的长度 s -> s, // 值:字符串本身 (existing, replacement) -> existing + ", " + replacement // 合并函数 )); // 输出 Map System.out.println("Map: " + map); } } =========输出结果================== Map: {5=Apple, 6=Banana, Cherry, Berry}
3.`Collectors.groupingBy()`简介
`Collectors.groupingBy()` 用于将流中的元素按照某个条件分组 生成一个 `Map`, 其中键是分组条件的结果, 值是符合该条件的元素列表。 方法签名 public static <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier)例
import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; public class GroupingByExample { public static void main(String[] args) { // 创建一个 Stream Stream<String> stream = Stream.of("Apple", "Banana", "Cherry", "Apricot", "Blueberry"); // 使用 Collectors.groupingBy() 按照字符串的首字母分组 Map<Character, List<String>> groupedByFirstLetter = stream.collect(Collectors.groupingBy( s -> s.charAt(0) // 分组条件:字符串的首字母 )); // 输出 Map System.out.println("Grouped by First Letter: " + groupedByFirstLetter); } } =============输出结果================ Grouped by First Letter: {A=[Apple, Apricot], B=[Banana, Blueberry], C=[Cherry]}
自定义下游收集器
可使用下游收集器来进一步处理分组后的结果 例: 统计每个分组中的元素数量
import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; public class GroupingWithDownstreamExample { public static void main(String[] args) { // 创建一个 Stream Stream<String> stream = Stream.of("Apple", "Banana", "Cherry", "Apricot", "Blueberry"); // 使用 Collectors.groupingBy() 按照字符串的首字母分组,并统计每个分组的数量 Map<Character, Long> groupedByFirstLetterCount = stream.collect(Collectors.groupingBy( s -> s.charAt(0), // 分组条件:字符串的首字母 Collectors.counting() // 下游收集器:统计数量 )); // 输出 Map System.out.println("Grouped by First Letter Count: " + groupedByFirstLetterCount); } } ==============输出结果================= Grouped by First Letter Count: {A=2, B=2, C=1}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。