首页 > 其他分享 >stream流根据集合某个字段去重

stream流根据集合某个字段去重

时间:2023-03-23 12:45:04浏览次数:36  
标签:map stream getNumber distinctByKey 字段 itemsMap 集合 seen

//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()));
            }
        });

标签:map,stream,getNumber,distinctByKey,字段,itemsMap,集合,seen
From: https://www.cnblogs.com/chillymint/p/17247053.html

相关文章

  • Stream流方法的一些简单练习题
    Stream流练习题1、数据过滤定义一个集合,并添加一些整数1,2,3,4,5,6,7,8,9,10过滤奇数,只留下偶数并将结果保存起来。/***@author戒爱学Java*@date2023/3/239:......
  • Stream流
    Stream流Stream流的作用:结合了Lambda表达式,简化集合、数组的操作Stream流的使用步骤以及方法详解:先得到一条Stream流(流水线),并把数据放上去。/* 单列集合*/ Arr......
  • Django笔记五之字段类型
    这篇笔记介绍字段的类型FieldType。Django的model下的field对应的是MySQL中的表字段,而我们定义的field的类型则对应MySQL中的字段类型。本次主要介绍以下几......
  • P2500 [SDOI2012]集合
    [SDOI2012]集合LuoguP2500[SDOI2012]集合题目描述小H在学习“集合与图论”的时候遇到了一个问题,他思考了很久依然无法很好完成这个问题。于是他只好来求助你了,给出n个......
  • Java:数据表的字段设计了默认值0不生效的原因
    在数据表里给字段设置了默认值为0,但是在插入的时候不生效,数据表设计如下 通过数据表生成的实体类查看代码@Data@TableName(value="user")@NoArgsConstructor@A......
  • JAVA~适合新手和复习~基础三(集合所有常用方法)
    Java集合框架  1Set和List的区别21.Set接口实例存储的是无序的,不重复的数据。List接口实例存储的是有序的,可以重复的元素。342.Set检索效率低下,删除和......
  • Nginx异常信息 upstream timed out (110: Connection timed out) while reading respo
    upstreamtimedout(110:Connectiontimedout)whilereadingresponseheaderfromupstreamNginx代理配置如下:###proxysettingsstartproxy_http_version1.1;p......
  • Django笔记四之字段属性
    这篇笔记介绍的fieldoptions,也就是字段的选项属性。首先,关于model,是数据库与python代码里的一个映射关系,每一个model是django.db.models.Model的一个子类。mode......
  • java集合相关问题
    Hashmap原理分析ConcurrentHashMap相关问题HashMap和Hashtable和HashTree和ConcurrentMap的比较HashMap和Hashtable和HashTree和ConcurrentMap的区别Vecto......
  • Map集合
    概念:一种可以自行定义检索规则的数据结构,也叫字典构成:key-value注意:null值可以作为keykey值具有唯一性HasMmap的Key其本质是数组+链表构成的红黑树点击查看代......