Java中Stream流去除List重復(fù)元素的方法
本文實(shí)例為大家分享了Java中Stream流去除List重復(fù)元素的具體代碼,供大家參考,具體內(nèi)容如下
業(yè)務(wù)場景
在開發(fā)中我們常常需要過濾List中的重復(fù)對象,而重復(fù)的定義往往是根據(jù)單個條件或者多個條件,如果是單個條件的話還是比較好處理的,即使不使用工具,代碼也可以很容易實(shí)現(xiàn),但如果判斷依據(jù)不是單個條件,而是多個條件的話,代碼實(shí)現(xiàn)起來就會比較復(fù)雜,此時我們一般就會使用工具來簡化開發(fā)
單條件去重代碼
ArrayList<listData> collect = list.stream().collect(Collectors.collectingAndThen( ? ? ? ? ? Collectors.toCollection(() -> new TreeSet<>( ? ? ? ? ? ? Comparator.comparing( ? ? ? ? listData::getId))), ArrayList::new));
解釋
list-列表
listData-列表中存的對象
id是判斷是否重復(fù)的條件,只保留唯一id對象
多條件去重代碼
ArrayList<listData> collect = list.stream().collect(Collectors.collectingAndThen( ? ? ?Collectors.toCollection(() -> new TreeSet<>( ? ? ? ?Comparator.comparing(p->p.getPatentName() + ";" + p.getLevel()))), ArrayList::new));
測試代碼
import java.util.*;
import java.util.stream.Collectors;
public class ExcelUtil {
? ? private static String[] params = {"p001","p002","p003","p004"};
? ? public static void main(String[] args) {
? ? ? ? List<Datum> dataList = new ArrayList<>();
? ? ? ? for (int i = 0; i < 100; i++) {
? ? ? ? ? ? if (i%2==0){
? ? ? ? ? ? ? ? Datum datum = new Datum(
? ? ? ? ? ? ? ? ? ? ? ? params[new Random().nextInt(params.length)],
? ? ? ? ? ? ? ? ? ? ? ? params[new Random().nextInt(params.length)],
? ? ? ? ? ? ? ? ? ? ? ? params[new Random().nextInt(params.length)],
? ? ? ? ? ? ? ? ? ? ? ? params[new Random().nextInt(params.length)],
? ? ? ? ? ? ? ? ? ? ? ? params[new Random().nextInt(params.length)]
? ? ? ? ? ? ? ? );
? ? ? ? ? ? ? ? dataList.add(datum);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ??
? ? ? ? System.out.println("0 size : "+dataList.size()+" -> "+dataList);
? ? ? ? // 單條件
? ? ? ? ArrayList<Datum> collect1 = dataList.stream().collect(Collectors.collectingAndThen(
? ? ? ? ? ? ? ? Collectors.toCollection(() -> new TreeSet<Datum>(
? ? ? ? ? ? ? ? ? ? ? ? Comparator.comparing(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Datum::getId))), ArrayList::new));
? ? ? ? System.out.println("1 size : "+collect1.size()+" -> "+collect1);
? ? ? ? // 兩個條件
? ? ? ? ArrayList<Datum> collect2 = dataList.stream().collect(Collectors.collectingAndThen(
? ? ? ? ? ? ? ? Collectors.toCollection(() -> new TreeSet<>(
? ? ? ? ? ? ? ? ? ? ? ? Comparator.comparing(p->p.getId() + ";" + p.getAddress()))), ArrayList::new));
? ? ? ? System.out.println("2 size : "+collect2.size()+" -> "+collect2);
? ? ? ? // 三個條件
? ? ? ? ArrayList<Datum> collect3 = dataList.stream().collect(Collectors.collectingAndThen(
? ? ? ? ? ? ? ? Collectors.toCollection(() -> new TreeSet<>(
? ? ? ? ? ? ? ? ? ? ? ? Comparator.comparing(p->p.getInfo() + ";" + p.getAddress()+";"+p.getName()))), ArrayList::new));
? ? ? ? System.out.println("3 size : "+collect3.size()+" -> "+collect3);
? ? }
}效果

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Scheduled如何會在上次任務(wù)執(zhí)行完才會執(zhí)行下次任務(wù)
這篇文章主要介紹了Scheduled如何會在上次任務(wù)執(zhí)行完才會執(zhí)行下次任務(wù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
IDEA安裝阿里巴巴編碼規(guī)范插件的兩種方式詳解(在線安裝和離線安裝)
這篇文章主要介紹了IDEA安裝阿里巴巴編碼規(guī)范插件的兩種方式詳解(在線安裝和離線安裝),本文通過截圖給大家展示的非常詳細(xì),需要的朋友可以參考下2021-09-09
SpringBoot實(shí)現(xiàn)登錄攔截器超詳細(xì)教程分享
對于管理系統(tǒng)或其他需要用戶登錄的系統(tǒng),登錄驗(yàn)證都是必不可少的環(huán)節(jié),尤其在?SpringBoot?開發(fā)的項(xiàng)目中。本文為大家準(zhǔn)備了超詳細(xì)的SpringBoot實(shí)現(xiàn)登錄攔截器方法,快收藏一波吧2023-02-02
java正則表達(dá)式的應(yīng)用 java讀取文件并獲取電話號碼
這篇文章主要介紹了java正則表達(dá)式的應(yīng)用,應(yīng)用的內(nèi)容是java讀取文件并獲取電話號碼,感興趣的小伙伴們可以參考一下2015-11-11
SpringBoot項(xiàng)目使用內(nèi)置的單機(jī)任務(wù)調(diào)度功能詳解
這篇文章主要介紹了SpringBoot項(xiàng)目使用內(nèi)置的單機(jī)任務(wù)調(diào)度功能詳解,SpringBoot框架中提供了2個注解來讓開發(fā)者快速配置來實(shí)現(xiàn)單機(jī)定時任務(wù)調(diào)度的功能,分別是@EnableScheduling和 @Scheduled,需要的朋友可以參考下2024-01-01
SpringBoot調(diào)用公共模塊的自定義注解失效的解決
這篇文章主要介紹了SpringBoot調(diào)用公共模塊的自定義注解失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Java 守護(hù)線程_動力節(jié)點(diǎn)Java學(xué)院整理
Java語言機(jī)制是構(gòu)建在JVM的基礎(chǔ)之上的,意思是Java平臺把操作系統(tǒng)的底層給屏蔽起來,所以它可以在它自己的虛擬的平臺里面構(gòu)造出對自己有利的機(jī)制,而語言或者說平臺的設(shè)計(jì)者多多少少是收到Unix思想的影響,而守護(hù)線程機(jī)制又是對JVM這樣的平臺湊合,于是守護(hù)線程應(yīng)運(yùn)而生2017-05-05

