Stream Collector.toMap 调用 toString 而不是 value



我一直在试图弄清楚为什么这不再有效。一切都工作正常,对象或调用它的函数没有任何变化。我正在使用龙目岛作为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;
}
)
);

相关内容

最新更新