如何在 Java ArrayList 中组合具有相同 ID 的对象?

问题描述 投票:0回答:1

我正在处理 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的所有对象的位置。

java arraylist java-stream
1个回答
0
投票

有两种方法可以做到这一点。

1.使用地图

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);

2.使用 Stream
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);
© www.soinside.com 2019 - 2024. All rights reserved.