假设有以下两个对象的集合:

List<Person> personList = new ArrayList<>();
personList.add(new Person('张三', '111111111111111111', '码农'));
personList.add(new Person('李四', '222222222222222222', '产品经理'));
personList.add(new Person('王五', '333333333333333333', '设计师'));
personList.add(new Person('张三', '111111111111111111', '项目经理'));

List<Member> memberList = new ArrayList<>();
memberList.add(new Member('111111111111111111', '张三', 'CEO'));
memberList.add(new Member('111111111111111111', '张三', 'CTO'));
memberList.add(new Member('222222222222222222', '李四', 'COO'));
memberList.add(new Member('333333333333333333', '王五', 'CFO'));

可以按照以下步骤进行合并:

  1. 先将两个集合合并成一个新的集合,并根据 memCode 进行分组:
List<VillagePartyOrgVO> voList = Stream.concat(
        personList.stream().map(VillagePartyOrgVO::new),
        memberList.stream().map(VillagePartyOrgVO::new)
    )
    .collect(Collectors.groupingBy(
        v -> v.getMemCode() == null ? v.getName() + v.getIdCard() : v.getMemCode()
    ))
    .values()
    .stream()
    .flatMap(list -> {
        if (list.size() == 1) {
            return list.stream();
        }
        Map<String, List<VillagePartyOrgVO>> map = list.stream().collect(Collectors.groupingBy(VillagePartyOrgVO::getType));
        for (List<VillagePartyOrgVO> l : map.values()) {
            if (l.size() > 1) {
                l.forEach(v -> v.setDuplicate(true));
            }
        }
        return map.values().stream().flatMap(l -> {
            if (l.size() == 1) {
                return l.stream();
            }
            VillagePartyOrgVO vo = l.get(0);
            vo.setPositions(l.stream().map(VillagePartyOrgVO::getPosition).collect(Collectors.toList()));
            vo.setDuplicate(true);
            return Stream.of(vo);
        });
    })
    .collect(Collectors.toList());
  1. 将合并后的集合转换成 Page 对象:
Page<VillagePartyOrgVO> page = new PageImpl<>(voList);

完整代码如下:

import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {

    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person('张三', '111111111111111111', '码农'));
        personList.add(new Person('李四', '222222222222222222', '产品经理'));
        personList.add(new Person('王五', '333333333333333333', '设计师'));
        personList.add(new Person('张三', '111111111111111111', '项目经理'));
        
        List<Member> memberList = new ArrayList<>();
        memberList.add(new Member('111111111111111111', '张三', 'CEO'));
        memberList.add(new Member('111111111111111111', '张三', 'CTO'));
        memberList.add(new Member('222222222222222222', '李四', 'COO'));
        memberList.add(new Member('333333333333333333', '王五', 'CFO'));
        
        List<VillagePartyOrgVO> voList = Stream.concat(
                personList.stream().map(VillagePartyOrgVO::new),
                memberList.stream().map(VillagePartyOrgVO::new)
            )
            .collect(Collectors.groupingBy(
                v -> v.getMemCode() == null ? v.getName() + v.getIdCard() : v.getMemCode()
            ))
            .values()
            .stream()
            .flatMap(list -> {
                if (list.size() == 1) {
                    return list.stream();
                }
                Map<String, List<VillagePartyOrgVO>> map = list.stream().collect(Collectors.groupingBy(VillagePartyOrgVO::getType));
                for (List<VillagePartyOrgVO> l : map.values()) {
                    if (l.size() > 1) {
                        l.forEach(v -> v.setDuplicate(true));
                    }
                }
                return map.values().stream().flatMap(l -> {
                    if (l.size() == 1) {
                        return l.stream();
                    }
                    VillagePartyOrgVO vo = l.get(0);
                    vo.setPositions(l.stream().map(VillagePartyOrgVO::getPosition).collect(Collectors.toList()));
                    vo.setDuplicate(true);
                    return Stream.of(vo);
                });
            })
            .collect(Collectors.toList());
        
        Page<VillagePartyOrgVO> page = new PageImpl<>(voList);
    }

    @Data
    @AllArgsConstructor
    static class Person {
        private String name;
        private String idCard;
        private String position;
    }

    @Data
    @AllArgsConstructor
    static class Member {
        private String memCode;
        private String name;
        private String position;
    }

    @Data
    static class VillagePartyOrgVO {
        private String name;
        private String idCard;
        private String memCode;
        private String type;
        private String position;
        private boolean duplicate;
        private List<String> positions;

        public VillagePartyOrgVO(Person person) {
            this.name = person.getName();
            this.idCard = person.getIdCard();
            this.type = 'person';
            this.position = person.getPosition();
        }

        public VillagePartyOrgVO(Member member) {
            this.name = member.getName();
            this.memCode = member.getMemCode();
            this.type = 'member';
            this.position = member.getPosition();
        }
    }
}
Java8 Stream 合并集合并分组:将 Person 和 Member 集合合并成 VillagePartyOrgVO 并进行分组和重复数据处理

原文地址: https://www.cveoy.top/t/topic/nuB7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录