두 개의 목록. 스트림 쓰기 방법을 사용하여 다른 목록의 속성 값에 따라 목록의 개체에 일부 속성을 할당하는 방법은 무엇입니까?

두 개의 목록. 스트림 쓰기 방법을 사용하여 다른 목록의 속성 값에 따라 목록의 개체에 일부 속성을 할당하는 방법은 무엇입니까?

이 요구 사항을 충족하려면 Java 8 이상에서 스트림과 람다 식을 사용할 수 있습니다. 두 개의 목록이 있다고 가정합니다. 하나는 속성이 할당될 개체를 포함하는 sourceList이고 다른 하나는 속성 값이 있는 개체를 포함하는 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 메소드를 사용하여 시퀀스의 인덱스를 소스 및 대상 목록의 객체에 하나씩 매핑합니다. 그런 다음 해당 인덱스에 따라 소스 목록과 대상 목록의 개체를 가져오고 할당해야 하는 속성을 할당합니다. 마지막으로 할당된 대상 개체를 새 목록으로 수집합니다.

Java에서 스트림을 사용하여 목록을 kv 구조의 맵으로 바꾸시겠습니까?

Java에서는 Collectors.toMap과 결합된 스트림(Stream)의 수집 메소드를 사용하여 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 메소드를 사용하여 personList를 스트림으로 변환합니다. 그런 다음 Collectors.toMap과 결합된 Collect 메소드를 사용하여 스트림의 각 요소를 키-값 쌍으로 매핑하고 이를 Map으로 수집합니다. toMap 메소드에서 Person::getName은 Person 객체의 name 속성을 키로 사용한다는 의미이고, Person::getAge는 Person 객체의 age 속성을 값으로 사용한다는 의미입니다. 마지막으로 forEach 메소드를 통해 변환된 Map 결과를 순회하여 출력합니다.

목록에 중복된 키가 있는 경우 java.lang.IllegalStateException이 발생합니다. 이 경우 세 번째 매개변수 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