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 中国大陆许可协议进行许可。

posted @   chillymint  阅读(792)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑