java8 groupby 对多个字段进行去重, 统计

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 groovy.transform.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;
        }
        }


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

猜你喜欢

转载自www.cnblogs.com/lshan/p/11096289.html