zoukankan      html  css  js  c++  java
  • java8 groupby 对多个字段进行去重, 统计 partitioningBy

    package com.icil.elsa.test.utils;
    
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Map;
    import java.util.TreeSet;
    import java.util.stream.Collectors;
    
    import org.junit.Test;
    
    import lombok.ToString;
    import lombok.Data;
    
    
    
    /**
     * 用 java8 对 list 按照多个字段进行去重 id  ,  message ,orderNO 去重
     * 对对象 MilestonesValidTO 按照 field 
     * 参考1:https://blog.csdn.net/robotfive/article/details/89200294
     * 参考2:https://blog.csdn.net/weixin_39643007/article/details/90511098 
     * @throws Exception
     */
    public class GroupBYTest {
        
        
        @Data
        @ToString
        public class MilestonesValidTO {
            private String id;
            
            private String message;
            
            private String orderNO;
            
            private String courierBillNo;
            
            private String status;
            
            public MilestonesValidTO(String id, String message, String orderNO, String courierBillNo) {
                super();
                this.id = id;
                this.message = message;
                this.orderNO = orderNO;
                this.courierBillNo = courierBillNo;
            }
            }
    
    
        /**
         #####如果 id + message + orderNo 都一样, 就认为是一条数据#######

    * 用 java8 对 list 按照多个字段进行去重 id , message ,orderNO 去重 * 对对象 MilestonesValidTO 按照 field * 如果仅仅是去重,推荐使用方式1 * @throws Exception
    */ /*################# 方式1: 直接重写 comparater 方法 ####################*/ @Test public void testGroupByMutilFiled1() throws Exception { ArrayList<MilestonesValidTO> list = new ArrayList<MilestonesValidTO>(); list.add(new MilestonesValidTO("1","A","sea","2341")); list.add(new MilestonesValidTO("1","A","sea","2341")); list.add(new MilestonesValidTO("3","B","sea","2341")); list.add(new MilestonesValidTO("4","A","sea","2341")); list.add(new MilestonesValidTO("5","C","sea","2341")); List<MilestonesValidTO> lst = list.parallelStream().collect(Collectors.collectingAndThen(Collectors.toCollection( () -> new TreeSet<>(Comparator.comparing(o -> o.getId() + "#" + o.getMessage() + "#" + o.getOrderNO()))), ArrayList<MilestonesValidTO>::new)); lst.forEach(m-> System.err.println(m.toString())); } /** * 用 java8 对 list 按照多个字段进行去重 id , message ,orderNO 去重 * 对对象 MilestonesValidTO 按照 field * 方式2:用于收集,统计,比较合适 * @throws Exception */ /*################# 方式2: Collectors.groupingBy(内嵌groupBy) ####################*/ @Test public void testGroupByMutilFiled2() throws Exception { ArrayList<MilestonesValidTO> list = new ArrayList<MilestonesValidTO>(); list.add(new MilestonesValidTO("1","A","sea","2341")); list.add(new MilestonesValidTO("1","A","sea","2341")); list.add(new MilestonesValidTO("3","B","sea","2341")); list.add(new MilestonesValidTO("4","A","sea","2341")); list.add(new MilestonesValidTO("5","C","sea","2341")); // Map<String, Map<String, Double>> sumCase = statisticalAnalyses.stream() // .collect(Collectors.groupingBy( // StatisticalAnalysis::getCreateTime, // Collectors.groupingBy(StatisticalAnalysis::getHandlingDepartmentName, Collectors.summingDouble(StatisticalAnalysis::getSimplePenaltyAmount)))); Map<String, Map<String, List<MilestonesValidTO>>> collect = list.parallelStream() .collect(Collectors.groupingBy(MilestonesValidTO::getId,Collectors.groupingBy(MilestonesValidTO::getMessage))); collect.forEach((k,v)->{System.err.println("K->"+k+" V-->"+v);}); } }

    常用:

    //提取Bean 中的个别字段
    List<String> hbookingNo = houseLinkList.stream().map(MasterLinkDO::getBookingNo).collect(Collectors.toList()); //把一个大的list切割 List<List<String>> ListbookingNoList = Lists.partition(bookingNoList, 100); //过滤去重

    List<MilestoneInfo> successAndDistincList = worktbMileAllList.stream().filter(m->m.getSuccess()==true).collect(Collectors.collectingAndThen(Collectors.toCollection(
    // () -> new TreeSet<>(Comparator.comparing(o -> o.getCourierBillNo()))),
    () -> new TreeSet<>(Comparator.comparing(o -> o.getStatus() + "#" + o.getBookingNo() + "#" + o.getCourierBillNo()))),
    ArrayList<MilestoneInfo>::new));

    
                
     //分组
    Map<String, Map<String, List<MilestoneInfo>>> status_bookingNoAndDetailMap_map = worktbMileSuccessAndDistincList.stream()
            .collect(Collectors.groupingBy(MilestoneInfo::getStatus,Collectors.groupingBy(MilestoneInfo::getBookingNo)));
                    
        

     partitioningBy:

    有这样一个集合:
    
    List<Integer> integers = [ 1,2,3,4,5,6,7,8,9]
    现在需要把集合按奇偶数分割为两个列表。这种情况下,我们可以使用Collectors.partitioningBy来分割:
    
    Map<Boolean, List<Integer>> map = 
        integers.stream().collect(Collectors.partitioningBy(x -> x%2 == 0));
    partitioningBy会根据值是否为true,把集合分割为两个列表,一个true列表,一个false列表。
  • 相关阅读:
    【数组】Unique Paths II
    【数组】Unique Paths
    【数组】word search
    购物网站布局实战
    Javascript显示和隐式类型转换
    JS检测数据类型
    从setTimeout谈js运行机制
    0.1 + 0.2 = 0.30000000000000004怎样理解
    (译)详解javascript立即执行函数表达式(IIFE)
    Redis
  • 原文地址:https://www.cnblogs.com/lshan/p/11096289.html
Copyright © 2011-2022 走看看