如何解决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
相关产品推荐
相关产品推荐

