必要なときにいくつかの値を変更するストリームJAVA 8を使用したPOJOの2つのリストをマージする方法

pburgov:

あなたが私を助けることができる願っています。私は質問のタイトルについて自分自身を明確にしようとするでしょう。私はこのような1つのPOJOを持っています

public class Factor {
    private int id;
    private String item;
    private int unitId;
    private Double factor;

    // constructor getters and setters
}

私は2つ持っているList二つの異なるDBにおける2つの異なるテーブルからのデータを使用して、このクラスの。

equalsこの方法は、このように定義されます

import com.google.common.base.Objects;
//....
@Override
public boolean equals( Object o ) {
    if ( this == o )
        return true;
    if ( o == null || getClass() != o.getClass() )
        return false;
    Factor that = (Factor) o;
    return getUnitId() == that.getUnitId() &&
               Objects.equal(getItem(), that.getItem());
}

彼らは同じ持っているときに二つのオブジェクトが等しいと見なされるitemunitId属性を。

のは、私はこれらの2つのリストを持っているとしましょう:

List<Factor> listA = new ArrayList<>();
listA.add(new Factor(1, "Item1", 1, 0.5));
listA.add(new Factor(2, "Item1", 2, 0.6));
listA.add(new Factor(3, "Item2", 1, 1.0));
listA.add(new Factor(4, "Item3", 1, 2.0));

List<Factor> listB = new ArrayList<>();
listB.add(new Factor(0, "Item1", 1, 0.8));
listB.add(new Factor(0, "Item1", 2, 0.9));
listB.add(new Factor(0, "Item4", 1, 1.0));
listB.add(new Factor(0, "Item5", 1, 2.0));

撮影equalsアカウントにする方法を、リストの最初の2つの要素は対等と考えるべきです。

理由idsBリストにすべてをしているが0、そのテーブルを持っていないので、あるidフィールドを。

私は何を達成しようとしていることは、これら二つのリストをマージして新しいリストを作成することですが、オブジェクトが対等であれば、それは取るべきであるidからlistAしてからの要因listB

このように、結果リストには、次のオブジェクトを持っているでしょう

(1, "Item1", 1, 0.8)
(2, "Item1", 2, 0.9)
(0, "Item4", 1, 1.0)
(0, "Item5", 1, 2.0)

私は両方を持つリストを比較する方法を知っているstreamオブジェクトが等しいか異なっているが、誰もが対等を組み合わせた新しいオブジェクトを取得する方法を知っているとフィルタを?

エイドリアン:

あなたもオーバーライドされていることを仮定してhashCode、使用できるメソッドtoMapコレクタ:

Collection<Factor> values = Stream.concat(listA.stream(), listB.stream())
            .collect(Collectors.toMap(Function.identity(), 
                                      Function.identity(), (a, b) -> {
        return new Factor(a.getId(), a.getItem(), a.getUnitId(), b.getFactor());
    })).values();

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=215116&siteId=1