Java List按照某字段去重的使用示例
嘚吧嘚
Java8流的新類java.util.stream.Collectors實(shí)現(xiàn)了java.util.stream.Collector接口,同時(shí)又提供了大量的方法對(duì)流(stream)的元素執(zhí)行各種統(tǒng)計(jì)操作。
distinct
示例一
List<Map<String, Object>> mapList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
HashMap<String, Object> e = new HashMap<>();
e.put("name", "Mike");
e.put("age", 19);
mapList.add(e);
HashMap<String, Object> f = new HashMap<>();
f.put("name", "John");
f.put("age", 19);
mapList.add(f);
}
System.out.println(mapList);
System.out.println("===================去重===================");
List<Map<String, Object>> collect = mapList.stream().distinct().collect(Collectors.toList());
collect.forEach(System.out::println);
執(zhí)行結(jié)果如下

但是這種方式必須要每個(gè)鍵值對(duì)都一樣,才會(huì)被判定成重復(fù)的,否則不會(huì)被判為重復(fù),如下。
示例二
List<Map<String, Object>> mapList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
HashMap<String, Object> e = new HashMap<>();
e.put("name", "Mike");
e.put("age", 19 + i);
mapList.add(e);
HashMap<String, Object> f = new HashMap<>();
f.put("name", "John");
f.put("age", 19 + i);
mapList.add(f);
}
System.out.println(mapList);
System.out.println("===================去重===================");
List<Map<String, Object>> collect = mapList.stream().distinct().collect(Collectors.toList());
collect.forEach(System.out::println);
執(zhí)行結(jié)果如下

雖然name的值一樣,但是age的值不一樣,所以沒有被被判定為重復(fù)。
所以如果要按照某字段去重,請(qǐng)采用如下方式。
根據(jù)某個(gè)字段去重
List<Map<String, Object>> mapList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
HashMap<String, Object> e = new HashMap<>();
e.put("name", "Mike");
e.put("age", 19 + i);
mapList.add(e);
HashMap<String, Object> f = new HashMap<>();
f.put("name", "John");
f.put("age", 19 + i);
mapList.add(f);
}
System.out.println(mapList);
System.out.println("===================去重===================");
List<Map<String, Object>> collect = mapList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(p -> String.valueOf(p.get("name"))))), ArrayList::new));
collect.forEach(System.out::println);
執(zhí)行結(jié)果如下

代碼中用到了“Collectors.collectingAndThen”,這個(gè)函數(shù)是干什么的呢?咱們繼續(xù)。
Collectors.collectingAndThen()
從函數(shù)名字就可以看出,這個(gè)函數(shù)分為兩個(gè)部分,一個(gè)是collecting,另一個(gè)是then。
Collectors.collectingAndThen()函數(shù)很像map and reduce,它可接受兩個(gè)參數(shù),第一個(gè)參數(shù)用于reduce(collecting)操作,而第二參數(shù)用于map(then)操作。
也就是,先把流中的所有元素傳遞給第一個(gè)參數(shù),然后把生成的集合傳遞給第二個(gè)參數(shù)來處理。
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Double result = list.stream().collect(Collectors.collectingAndThen(Collectors.averagingLong(item -> item * 2), res -> res * 3));
System.out.println("result = " + result);
執(zhí)行結(jié)果如下

邏輯如下
把[1,2,3,4]這個(gè)集合傳遞給item -> item * 2這個(gè)lambda表達(dá)式,計(jì)算得出結(jié)果為[2,4,6,8]
然后再把[2,4,6,8]傳遞給Collectors.averagingLong表達(dá)式,計(jì)算得出5.0
然后傳遞給res -> res * 3這個(gè)lambda表達(dá)式,計(jì)算得到結(jié)果為15.0
到此這篇關(guān)于Java List按照某字段去重的使用示例的文章就介紹到這了,更多相關(guān)Java List字段去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
maven打包成第三方j(luò)ar包且把pom依賴包打入進(jìn)來的方法
這篇文章主要介紹了maven打包成第三方j(luò)ar包且把pom依賴包打入進(jìn)來的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
使用Java實(shí)現(xiàn)PDF文件安全檢測(cè)功能
在日常開發(fā)中,我們經(jīng)常需要處理用戶上傳的PDF文件,然而,PDF文件可能包含惡意腳本或危險(xiǎn)內(nèi)容,這些內(nèi)容可能對(duì)系統(tǒng)安全構(gòu)成威脅,本文將介紹如何使用Java實(shí)現(xiàn)一個(gè)PDF安全檢測(cè)工具類來防止惡意內(nèi)容注入,需要的朋友可以參考下2025-08-08
詳解Java關(guān)于JDK中時(shí)間日期的API
這篇文章主要介紹了詳解Java關(guān)于JDK中時(shí)間日期的API,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Maven+SSM框架實(shí)現(xiàn)簡(jiǎn)單的增刪改查
這篇文章主要介紹了Maven+SSM框架實(shí)現(xiàn)簡(jiǎn)單的增刪改查,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03
Java在運(yùn)行時(shí)識(shí)別類型信息的方法詳解
這篇文章主要給大家介紹了關(guān)于Java在運(yùn)行時(shí)識(shí)別類型信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面來一起看看吧2019-01-01

