我一直在试图弄清楚为什么这不再有效。一切都工作正常,对象或调用它的函数没有任何变化。我正在使用龙目岛作为getter,setters,最初是toString,但我不明白它会如何劫持getter。我还编写了明确的 getter 来排除故障,但无济于事。
类
@Data
class Engineer {
private String name;
private String tech;
@Override
public String toString() {
return "test " + name;
}
}
使用它的方法
public void example(List<Engineer> engineers) {
//creates keys with toString and creates duplicates
Map<String, Engineer> streamMap = engineers.stream().collect(Collectors.toMap(Engineer::getName, Function.identity()));
//while this one works
Map<String, Engineer> forLoopMap = new HashMap<>();
for(Engineer engineer : engineers) {
forLoopMap.put(engineer.getName, engineer);
}
}
我通过仅使用字符串和名称创建自定义 toString 来解决此问题。我最初的错误是一个延迟加载问题,因为toString试图获取这些对象。
在我创建自定义 toString 后,当我知道名称保持唯一时,它开始给我重复的键错误。
这不仅发生在一个数据列表上,而且发生在使用不同唯一标识符的单独实体列表上。
我已经使用这种流模式一段时间了,它工作正常,但现在它遇到了问题。任何想法将不胜感激。
编辑 - 测试:
- 显式制作 toString(调用 getName 作为方法引用调用 toString(
- 显式制作的getName(最初由龙目岛插件生成(
- 在开发配置文件中工作,但不能与生产配置文件一起使用 - 一定是不同的
你可以提供mergeFunction,它是BinaryOpearator,用于重复键。如果键重复,最后一个值将被覆盖。
Map<String, Engineer> streamMap = engineers.stream()
.collect(Collectors.toMap(Engineer::getName, Function.identity(),
(e1, e2) -> {
System.out.println("Duplicate key found!");
return e2;
}
)
);