我正在处理 java 列表的问题,需要从中合并两个对象的信息。
这是我的代码
Person person1 = new Person(1, 470, new ArrayList<>(Arrays.asList(new position(45, LocalDate.now()), new position(42, LocalDate.now()) )) );
Person person2 = new Person(1, 320, new ArrayList<>(Arrays.asList(new position(35, LocalDate.now()) )) );
List<Person> list = new ArrayList<>();
list.add(person1);
list.add(person2);
for(Person person:list){
int id= person.getId();;
List<position> aux = new ArrayList<>();
list.stream().forEach(x -> {
if(x.getId()==id){
aux.addAll( x.getPosition());
}
});
person.setPosition(aux);
}
这是我的打印
[person{id=1, contrac=470, position=[position{id=45, bd=2023-04-14}, position{id=42, bd=2023-04-14}, position{id=35, bd=2023-04-14}]}, person{id=1, contrac=320, position=[position{id=45, bd=2023-04-14}, position{id=42, bd=2023-04-14}, position{id=35, bd=2023-04-14}, position{id=35, bd=2023-04-14}]}]
最后我有两个对象,而你只需要一个 任何只获得一个或改进代码的建议
我试图通过id只获取一个对象,其中包含具有相同id的所有对象的位置信息
有两种方法可以做到这一点。
Map<Integer, Person> map = new HashMap<>();
for (Person person : list) {
int id = person.getId();
if (!map.containsKey(id)) {
map.put(id, person);
} else {
Person existingPerson = map.get(id);
List<position> positions = existingPerson.getPosition();
positions.addAll(person.getPosition());
existingPerson.setPosition(positions);
}
}
List<Person> mergedList = new ArrayList<>(map.values());
System.out.println(mergedList);
Collectors.groupingBy()
List<Person> mergedList = list.stream()
.collect(Collectors.groupingBy(Person::getId))
.values().stream()
.map(group -> {
int id = group.get(0).getId();
int contract = group.get(0).getContract();
List<Position> positions = group.stream()
.flatMap(person -> person.getPositions().stream())
.collect(Collectors.toList());
return new Person(id, contract, positions);
})
.collect(Collectors.toList());
System.out.println(mergedList);