现在有两个集合合并成一个新的集合memCode不为空时根据memcode分组否则根据姓名和身份证进行分组分组时重复的数据进行标记并把重复数据的职位处理成list集合然后把结果list转成page对象java8 steam 应该怎么写
假设有如下实体类:
public class Member {
private String name;
private String idCard;
private String memCode;
private String position;
// 省略构造方法和getter/setter方法
}
可以按照以下步骤实现:
-
将两个集合合并成一个新的集合:
List<Member> list1 = ...; // 第一个集合 List<Member> list2 = ...; // 第二个集合 List<Member> mergedList = Stream.concat(list1.stream(), list2.stream()) .collect(Collectors.toList()); -
根据memCode或姓名和身份证进行分组:
Map<String, List<Member>> groupMap = mergedList.stream() .collect(Collectors.groupingBy( member -> member.getMemCode() != null ? member.getMemCode() : member.getName() + member.getIdCard() )); -
处理重复数据并将职位处理成list集合:
List<Member> resultList = groupMap.values().stream() .flatMap(list -> { Map<String, List<Member>> positionMap = list.stream() .collect(Collectors.groupingBy(Member::getPosition)); return positionMap.values().stream() .map(positionList -> { Member member = positionList.get(0); if (positionList.size() > 1) { member.setPosition(positionList.stream() .map(Member::getPosition) .collect(Collectors.toList())); } return member; }); }) .collect(Collectors.toList()); -
将结果list转成page对象:
int pageNum = ...; // 当前页码 int pageSize = ...; // 每页记录数 int total = resultList.size(); // 总记录数 int startIndex = (pageNum - 1) * pageSize; // 计算起始索引 int endIndex = Math.min(startIndex + pageSize, total); // 计算结束索引 List<Member> pageList = resultList.subList(startIndex, endIndex); // 分页结果list Page<Member> page = new PageImpl<>(pageList, PageRequest.of(pageNum - 1, pageSize), total); ``
原文地址: https://www.cveoy.top/t/topic/cnAf 著作权归作者所有。请勿转载和采集!