stream流根据集合某个字段去重
//stream流根据集合某个字段去重,流.filter(distinctByKey)
定义方法
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> seen.add(keyExtractor.apply(t));
}
具体案例:
HashMap<String, List<InvoiceOcrItemsDTO>> itemsMap = new HashMap<>();
//按号码分组,这里分组可以重复,此处测试用例key相同value不同
Map<String, List<InvoiceOcrDTO>> invoiceMap = invoiceOcrInfo.stream().collect(Collectors.groupingBy(e -> e.getNumber()));
for (Map.Entry<String, List<InvoiceOcrDTO>> map : invoiceMap.entrySet()) {
List<InvoiceOcrItemsDTO> items = new ArrayList<>();
map.getValue().forEach(e -> {
//所有行放进集合再取给map
items.addAll(e.getItems());
});
itemsMap.put(map.getKey(), items);
}
//去重
List<InvoiceOcrDTO> result = invoiceOcrInfo.stream().filter(distinctByKey(InvoiceOcrDTO::getNumber)).collect(Collectors.toList());
result.forEach(e->{
//如果去重后的元素在分组中
if(invoiceMap.containsKey(e.getNumber())){
String name = itemsMap.get(e.getNumber()).stream().map(InvoiceOcrItemsDTO::getName).collect(Collectors.toList()).toString();
e.setItemNames(name);
e.setItems(itemsMap.get(e.getNumber()));
}
});
本文作者:chillymint
本文链接:https://www.cnblogs.com/chillymint/p/17247053.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步