2 つのリスト。ストリーム書き込みを使用して、別のリストの属性値に基づいてリスト内のオブジェクトに特定の属性を割り当てるにはどうすればよいですか?

2 つのリスト。ストリーム書き込みを使用して、別のリストの属性値に基づいてリスト内のオブジェクトに特定の属性を割り当てるにはどうすればよいですか?

Java 8 以降ではストリームとラムダ式を使用して、この要件を達成できます。2 つのリストがあり、1 つは属性が割り当てられるオブジェクトを含む sourceList であり、もう 1 つは属性値を持つオブジェクトを含む targetList であるとします。サンプルコードは次のとおりです。

import java.util.*;

class SourceObject {
    private String name;
    private int age;

    // 构造函数、getter和setter方法省略
}

class TargetObject {
    private String name;
    private int age;

    // 构造函数、getter和setter方法省略
}

public class Main {
    public static void main(String[] args) {
        List<SourceObject> sourceList = new ArrayList<>();
        sourceList.add(new SourceObject("John", 25));
        sourceList.add(new SourceObject("Alice", 30));
        sourceList.add(new SourceObject("Bob", 35));

        List<TargetObject> targetList = new ArrayList<>();
        targetList.add(new TargetObject(null, 0));
        targetList.add(new TargetObject(null, 0));
        targetList.add(new TargetObject(null, 0));

        // 使用流的方式将属性赋值
        List<TargetObject> result = IntStream.range(0, sourceList.size())
                .mapToObj(i -> {
                    TargetObject target = targetList.get(i);
                    SourceObject source = sourceList.get(i);
                    target.setName(source.getName());
                    target.setAge(source.getAge());
                    return target;
                })
                .collect(Collectors.toList());

        // 输出结果
        result.forEach(obj -> System.out.println("Name: " + obj.getName() + ", Age: " + obj.getAge()));
    }
}

この例では、IntStream の range メソッドを使用して一連の数値を生成し、次に、mapToObj メソッドを使用して、シーケンス内のインデックスをソース リストとターゲット リスト内のオブジェクトに 1 つずつマップします。次に、対応するインデックスに従ってソース リスト内のオブジェクトとターゲット リスト内のオブジェクトを取得し、それらに割り当てる必要がある属性を割り当てます。最後に、割り当てられたターゲット オブジェクトを新しいリストに収集します。

Java でストリームを使用してリストを KV 構造マップに変換しますか?

Javaでは、ストリーム(Stream)のcollectメソッドとCollectors.toMapを組み合わせて使用​​し、ListをKV構造のMapに変換できます。サンプルコードは次のとおりです。

import java.util.*;
import java.util.stream.Collectors;

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("John", 25));
        personList.add(new Person("Alice", 30));
        personList.add(new Person("Bob", 35));

        // 使用流的方式将List转换为Map
        Map<String, Integer> personMap = personList.stream()
                .collect(Collectors.toMap(Person::getName, Person::getAge));

        // 输出结果
        personMap.forEach((name, age) -> System.out.println("Name: " + name + ", Age: " + age));
    }
}

この例では、stream の stream メソッドを使用して personList をストリームに変換します。次に、collect メソッドを Collectors.toMap と組み合わせて使用​​し、ストリーム内の各要素をキーと値のペアにマップし、それらを Map に収集します。toMap メソッドにおいて、 Person::getName は Person オブジェクトの name 属性をキーとして使用することを意味し、 Person::getAge は Person オブジェクトの age 属性を値として使用することを意味します。最後に、forEach メソッドを通じて、変換された Map 結果をトラバースして出力します。

List に重複したキーがある場合、java.lang.IllegalStateException がスローされることに注意してください。この場合、3 番目のパラメーター mergeFunction を使用して重複キーの競合を処理できます。次に例を示します。

Map<String, Integer> personMap = personList.stream()
        .collect(Collectors.toMap(Person::getName, Person::getAge, (oldValue, newValue) -> newValue));

この例では、キーの値として新しい値を選択しただけですが、ニーズに応じて適切に処理できます。

おすすめ

転載: blog.csdn.net/weixin_50503886/article/details/132310121