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列表。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM