두 개의 목록. 스트림 쓰기 방법을 사용하여 다른 목록의 속성 값에 따라 목록의 개체에 일부 속성을 할당하는 방법은 무엇입니까?
이 요구 사항을 충족하려면 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));
이 예에서는 단순히 새 값을 키 값으로 선택했으며 필요에 따라 적절하게 처리할 수 있습니다.