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());
}
彼らは同じ持っているときに二つのオブジェクトが等しいと見なされるitem
とunitId
属性を。
のは、私はこれらの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つの要素は対等と考えるべきです。
理由ids
Bリストにすべてをしているが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();