【发布时间】:2015-07-22 23:17:03
【问题描述】:
我有一个对象流(一个列表),并希望从该流创建新对象,以插入到集合中。但是,传入 List 中的两个或多个对象可能会散列到 Set 中的同一个 Key,在这种情况下,我想将第 n 个 List 对象中的 String 附加到 Set 中已经存在的对象上,而不是创建一个新对象。
类似的东西,但是是函数式的:
HashSet<ClassB> mySet = new HashSet<>();
for (ClassA instanceA : classAList) {
if (mySet.contains(ClassB.key(instanceA))) { //static method call to find the key
mySet.get(instanceA).appendFieldA(instanceA.getFieldA());
} else {
mySet.add(new ClassB(instanceA));
}
}
return mySet;
在功能形式上,我想创建这样的东西:
List classAList = new ArrayList<>();
classAList.stream()
.map(instanceA -> new ClassB(instanceA))
.collect(Collectors.toSet());
但是,这当然会忽略哈希图,并且我无法将我的多个 ClassA 实例的字段组合起来,这些实例都将解析为同一个 ClassB。我不知道如何把它放在那里。我是否需要忽略 map() 调用并创建自定义收集器来完成这项工作?似乎有不止一种方法可以做到这一点,但我是 Streams 的新手。
【问题讨论】:
-
嗯,整个想法的问题在于,如果行为是基于状态的(无论是否有冲突的哈希对象在 Set 中),那么你就不再是在功能上做事了。跨度>
-
mySet.get(instanceA)应该是什么意思?我认为您混淆了地图和场景。你能粘贴你的实际代码吗?
标签: java java-8 java-stream