notAChance:
私は、以下のこのロジック試してみると、図のように一緒に遊んだいくつかのサンプルコードをしましたので。それはちょうど一つの大きなmainメソッドと2つのPOJOのだが、それが実行されます。私は、終了の時点で値を取得するために、デバッグしています。
public class Main {
public static void main(String[] args) {
obj1 obj1 = new obj1();
obj1 obj12 = new obj1();
obj2 obj2 = new obj2();
obj2 obj22 = new obj2();
obj1.id = 123L;
obj1.carId = 1234L;
obj12.id = 123L;
obj12.carId = 1234L;
obj2.carId = 1234L;
obj22.carId = 12345L;
ArrayList<obj1> obj1Arr = new ArrayList<>();
ArrayList<obj2> obj2Arr = new ArrayList<>();
obj1Arr.add(obj1);
obj1Arr.add(obj12);
obj2Arr.add(obj2);
obj2Arr.add(obj22);
List<obj2> newCarList= obj2Arr.stream()
.filter(anObjOf2 -> obj1Arr
.stream()
.anyMatch(carReg -> carReg.getCarId().equals(anObjOf2.getCarId())))
.collect(Collectors.toList());
}
}
POJO1:
public class obj1 {
Long id = null;
Long carId = null;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getCarId() {
return carId;
}
public void setCarId(Long carId) {
this.carId = carId;
}
}
POJO2:
public class obj2 {
Long id = null;
Long carId = null;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getCarId() {
return carId;
}
public void setCarId(Long carId) {
this.carId = carId;
}
}
あなたが見ることができるように、私はストリーミングと任意のフィルタリングてるobj
上一致していないのをcarId
。私の次の目標は、その後にあるset
id
マッチしたオブジェクト上で(ないcarId)。
基本的に、もしobj1.carId == obj2.carId
THEN set obj1.id = obj2.id
。
私の問題は、私は同じストリームでこれを行う方法がわからないです。出来ますか?私は助けることはできませんが、この時点では、イテレータの必要があると思いますか?
tobias_k:
私が最初に作成することをお勧めしたいMap
のマッピングをcarId
するid
(私は間違いだったと仮定し、それより読みやすく、削除、重複IDを、作るためにあなたのクラスビットを変更した)最初のリストの各要素について:
@Data @AllArgsConstructor
class Car {
Long id = null;
Long carId = null;
}
List<Car> obj1Arr = Arrays.asList(new Car(1L, 123L), new Car(2L, 1234L));
List<Car> obj2Arr = Arrays.asList(new Car(0L, 1234L), new Car(0L, 12345L));
Map<Long, Long> carIdToId = obj1Arr.stream()
.collect(Collectors.toMap(Car::getCarId, Car::getId));
// [Car(id=2, carId=1234), Car(id=0, carId=12345)]
そして、あなたはこれを使用することができMap
、同じで自動車用フィルターにcarID
お互いの車と比較することなく。次に、使用することは、forEach
単に元のリスト内のIDを設定します。
obj2Arr.stream()
.filter(anObjOf2 -> carIdToId.containsKey(anObjOf2.getCarId()))
.forEach(anObjOf2 -> anObjOf2.setId(carIdToId.get(anObjOf2.getCarId())));
System.out.println(obj2Arr);
// [Car(id=2, carId=1234), Car(id=0, carId=12345)]
あなたがしたい場合のみ等しいとアイテムをcarId
、あなたはにIDを設定することができpeek
、その後collect
。これはまだかかわらず、元のインスタンスを変更します:
obj2Arr = obj2Arr.stream()
.filter(anObjOf2 -> carIdToId.containsKey(anObjOf2.getCarId()))
.peek(anObjOf2 -> anObjOf2.setId(carIdToId.get(anObjOf2.getCarId())))
.collect(Collectors.toList());
System.out.println(obj2Arr);
// [Car(id=2, carId=1234)]
それとも全く新しいインスタンスのリストを作成します。
obj2Arr = obj2Arr.stream()
.map(Car::getCarId)
.filter(carIdToId::containsKey)
.map(carId -> new Car(carIdToId.get(carId), carId))
.collect(Collectors.toList());
System.out.println(obj2Arr);
// [Car(id=2, carId=1234)]