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

如何解决Java Stream转Map时的重复键IllegalStateException异常?

解决Collectors.toMap重复键抛出异常的问题

你遇到的IllegalStateException是因为listOfOrder中存在多个Order对象的driver属性值重复,而默认的Collectors.toMap()在检测到重复键时没有定义冲突处理逻辑,直接抛出异常。

解决这个问题的核心是给toMap()传入第三个参数——合并函数,用来指定当键重复时如何处理对应的两个值。以下是几种常见的处理方案:

方案1:保留第一个出现的对象(忽略后续重复项)

当遇到重复键时,保留第一次出现的Order对象,丢弃后续的:

Map<String, Order> splittedListMap = listOfOrder.stream()
    .collect(Collectors.toMap(
        Order::getDriver, 
        order -> order, // 注:你原代码中的Order::getOrder大概率是笔误,若要将对象本身作为值,直接用order -> order或Function.identity()即可
        (oldValue, newValue) -> oldValue // 重复时保留旧值
    ));

方案2:保留最后出现的对象

当遇到重复键时,用最后出现的Order对象覆盖之前的:

Map<String, Order> splittedListMap = listOfOrder.stream()
    .collect(Collectors.toMap(
        Order::getDriver, 
        order -> order,
        (oldValue, newValue) -> newValue // 重复时用新值覆盖旧值
    ));

方案3:将重复键对应的对象收集为列表

如果需要保留所有重复键对应的对象,可以把Map的value类型改为List<Order>,用groupingBy实现更简洁:

Map<String, List<Order>> splittedListMap = listOfOrder.stream()
    .collect(Collectors.groupingBy(Order::getDriver));

也可以用toMap配合合并函数手动实现:

Map<String, List<Order>> splittedListMap = listOfOrder.stream()
    .collect(Collectors.toMap(
        Order::getDriver,
        order -> new ArrayList<>(Collections.singletonList(order)),
        (oldList, newList) -> {
            oldList.addAll(newList);
            return oldList;
        }
    ));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:22:31