将对象添加到集合时,使用mergeFunction

时间:2019-03-27 19:35:30

标签: java

我有一个Java类FooFoo有两个字段,Integer barString baz。我还有一组Set<Foo> foos。当我运行foos.add(newFoo)时,如果foos中已经存在一个与newFoo不“相等”但具有bar相同的对象,而不是添加{{1} }我希望它运行一个函数newFoo,该函数更新集合中已经存在的combine(Foo foo, Foo newFoo)(例如,通过添加两个foo值或其他任何值)。我怎样才能最好地做到这一点?

bar的结构,Foo的使用等不是一成不变的,可以更改以实现最佳实现)

1 个答案:

答案 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();

例如,您还需要自定义equalshashCode方法

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,也可以扩展该类。