You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Stream<String>创建按字符串长度分组的Map<Integer, Set<String>>?

解决Stream分组为Map<Integer, Set>的问题

嘿,刚上手Streams遇到这个分组需求太正常了!其实Java Streams的Collectors工具类里已经有现成的方法能完美解决这个问题,我给你一步步讲清楚:

核心思路

你需要的是按字符串长度分组,把相同长度的字符串归集到一个Set里。这里要用到Collectors.groupingBy()方法,它可以帮你把流中的元素按照指定规则分组,再通过下游收集器把每组元素转换成你想要的集合类型。

完整代码示例

直接看代码最直观,比如我们有一个字符串流,用下面的代码就能得到你要的Map:

// 示例字符串流
Stream<String> stringStream = Stream.of("apple", "banana", "cat", "dog", "elephant", "fox");

// 分组操作
Map<Integer, Set<String>> lengthGroupedMap = stringStream.collect(
    Collectors.groupingBy(
        String::length,  // 分组规则:用字符串的长度作为Map的key
        Collectors.toSet()  // 下游收集器:把同一组的字符串收集成Set
    )
);

代码解释

  • String::length:这是一个方法引用,作为分组的分类函数,它会把每个字符串的长度提取出来作为Map的key。
  • Collectors.toSet():这个下游收集器负责把同一长度的所有字符串收集到一个Set集合中,自动帮你去重(如果流里有重复字符串的话)。

进阶:指定Set的具体实现

如果你想明确指定用哪种Set(比如HashSet或者TreeSet),可以把Collectors.toSet()换成Collectors.toCollection():

Map<Integer, Set<String>> lengthGroupedMap = stringStream.collect(
    Collectors.groupingBy(
        String::length,
        Collectors.toCollection(HashSet::new)  // 明确使用HashSet
    )
);

这样得到的Map里,每个value都是HashSet类型,而不是toSet()返回的不确定Set类型。

内容的提问来源于stack exchange,提问作者Danny Bergs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:06:55