一つのストリーム内のフィルタとセット()

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.carIdTHEN 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)]

おすすめ

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