java8中stream().map().collect()的Collectors.toList()、Collectors.toMap()、Collectors.groupingBy()方法简介

欣喜 Java经验 发布时间:2025-03-25 15:19:48 阅读数:987 1
下文笔者讲述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}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202503/17428872488403.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者