Java8中排序对象并基于序号创建Map遇到问题
问题分析与修复方案
原代码存在的问题
- 类名不匹配:定义的实体类是
person,但流操作里误用了refDataDto,直接导致编译错误 - 方法名拼写错误:
getastName是笔误,正确写法应为getLastName - 冗余流操作:排序后无需先转成List再重新开启流,一次流操作即可完成排序+收集逻辑
- 潜在异常风险:
Collectors.toMap默认遇到重复Key会抛出IllegalStateException,如果列表中存在相同firstName的对象,必须指定重复Key的合并规则
修复后的代码
Map<String, String> xza = personList.stream() .sorted(Comparator.comparing(person::getOrderNum)) .collect(Collectors.toMap( person::getFirstName, person::getLastName, // 若存在重复firstName,保留排序后先出现的对象的lastName (existingVal, newVal) -> existingVal ));
补充说明
如果能确保personList中所有对象的firstName绝对唯一,也可以省略合并规则参数,但保留该参数能让代码更健壮,避免意外的运行时异常。
内容的提问来源于stack exchange,提问作者Hanuman
相关产品推荐
相关产品推荐

