我有一个Java类Foo
。 Foo
有两个字段,Integer bar
和String baz
。我还有一组Set<Foo> foos
。当我运行foos.add(newFoo)
时,如果foos
中已经存在一个与newFoo
不“相等”但具有bar
相同的对象,而不是添加{{1} }我希望它运行一个函数newFoo
,该函数更新集合中已经存在的combine(Foo foo, Foo newFoo)
(例如,通过添加两个foo
值或其他任何值)。我怎样才能最好地做到这一点?
(bar
的结构,Foo
的使用等不是一成不变的,可以更改以实现最佳实现)
答案 0 :(得分:0)
给出两个Set<Foo>
,使用Stream<Foo>
,您可以拥有
final Stream<Foo> combined = Stream.concat(setOne.stream(), setTwo.stream());
final Set<Foo> merged =
combined.collect(Collectors.toMap(
Function.identity(),
Function.identity(),
(foo, newFoo) -> {
// Your merge function
foo.baz += newFoo.baz;
return foo;
}
)).keySet();
例如,您还需要自定义equals
和hashCode
方法
public class Foo {
public Integer bar;
public String baz;
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final Foo foo = (Foo) o;
return Objects.equals(bar, foo.bar);
}
@Override
public int hashCode() {
return Objects.hash(bar);
}
}
如果您不能/不想直接自定义Foo
类的相等性,则可以创建一个包装类,例如FooWrapper
,也可以扩展该类。