Java8 Stream 合并集合并分组:将 Person 和 Member 集合合并成 VillagePartyOrgVO 并进行分组和重复数据处理
假设有以下两个对象的集合:
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'));
可以按照以下步骤进行合并:
- 先将两个集合合并成一个新的集合,并根据
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());
- 将合并后的集合转换成
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();
}
}
}
原文地址: https://www.cveoy.top/t/topic/nuB7 著作权归作者所有。请勿转载和采集!