Java - 当 id 相同时,从对象的 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 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.