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

如何用Java Stream将Stream<Character>转为Map<Character, Set<Character>>

更简洁的Java Stream实现:字符流转为键对应空HashSet的Map

需求回顾

输入一个可能包含重复字符的Stream<Character>,输出一个Map<Character, Set<Character>>,其中每个唯一字符作为键,对应的值是空的HashSet<Character>。

原问题分析

你最初的代码使用Collectors.toMap时,因为流中存在重复键(比如示例中的a),而toMap默认的合并策略会抛出IllegalStateException。修改后的代码通过添加合并函数解决了问题,但合并逻辑里的a.addAll(b)其实是多余的——因为两个值都是空集合,完全可以简化。

更简洁的实现方式

方式1:先去重再构建Map(最直观简洁)

先通过distinct()去掉流中的重复字符,再用toMap构建键值对,此时不会有重复键问题,无需合并函数:

import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class TransformExample {
    public static Map<Character, Set<Character>> transform(final Stream<Character> chars) {
        return chars.distinct()
                    .collect(Collectors.toMap(Function.identity(), k -> new HashSet<>()));
    }
}

方式2:简化toMap的合并函数

如果不想提前去重,可以保留原流,把合并函数简化为直接返回任意一个空集合(因为两个值都是空的,结果无差异):

import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class TransformExample {
    public static Map<Character, Set<Character>> transform(final Stream<Character> chars) {
        return chars.collect(Collectors.toMap(
            Function.identity(),
            HashSet::new,
            (existing, unused) -> existing
        ));
    }
}

方式3:使用groupingBy(可选)

利用groupingBy自动处理重复键的特性,下游收集器直接生成空集合:

import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class TransformExample {
    public static Map<Character, Set<Character>> transform(final Stream<Character> chars) {
        return chars.collect(Collectors.groupingBy(
            Function.identity(),
            Collectors.collectingAndThen(Collectors.toSet(), s -> new HashSet<>())
        ));
    }
}

推荐方案

方式1是最优选择:代码最短、逻辑最清晰,先去重避免了重复键的处理,完全符合需求场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:01:17