Java List按照某字段去重的使用示例
嘚吧嘚
Java8流的新類java.util.stream.Collectors實現(xiàn)了java.util.stream.Collector接口,同時又提供了大量的方法對流(stream)的元素執(zhí)行各種統(tǒng)計操作。
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é)果如下
但是這種方式必須要每個鍵值對都一樣,才會被判定成重復(fù)的
,否則不會被判為重復(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ù)。
所以如果要按照某字段去重
,請采用如下方式。
根據(jù)某個字段去重
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”,這個函數(shù)是干什么的呢?咱們繼續(xù)。
Collectors.collectingAndThen()
從函數(shù)名字就可以看出,這個函數(shù)分為兩個部分,一個是collecting,另一個是then。
Collectors.collectingAndThen()函數(shù)很像map and reduce,它可接受兩個參數(shù),第一個參數(shù)用于reduce(collecting)操作,而第二參數(shù)用于map(then)操作。
也就是,先把流中的所有元素傳遞給第一個參數(shù),然后把生成的集合傳遞給第二個參數(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]這個集合傳遞給item -> item * 2這個lambda表達式,計算得出結(jié)果為[2,4,6,8]
然后再把[2,4,6,8]傳遞給Collectors.averagingLong表達式,計算得出5.0
然后傳遞給res -> res * 3這個lambda表達式,計算得到結(jié)果為15.0
到此這篇關(guān)于Java List按照某字段去重的使用示例的文章就介紹到這了,更多相關(guān)Java List字段去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?Collection接口中的常用方法總結(jié)
這篇文章將大概用代碼案例簡單總結(jié)一下?Collection?接口中的一些方法,我們會以他的實現(xiàn)類?Arraylist?為例創(chuàng)建對象??煲黄饋砜纯窗?/div> 2022-12-12Java多線程之volatile關(guān)鍵字及內(nèi)存屏障實例解析
volatile是JVM提供的一種最輕量級的同步機制,因為Java內(nèi)存模型為volatile定義特殊的訪問規(guī)則,使其可以實現(xiàn)Java內(nèi)存模型中的兩大特性:可見性和有序性。這篇文章主要介紹了Java多線程之volatile關(guān)鍵字及內(nèi)存屏障,需要的朋友可以參考下2019-05-05Jmeter跨線程組傳值調(diào)用實現(xiàn)圖解
這篇文章主要介紹了Jmeter跨線程組傳值調(diào)用實現(xiàn)圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07java 字符串內(nèi)存分配的分析與總結(jié)(推薦)
下面小編就為大家?guī)硪黄猨ava 字符串內(nèi)存分配的分析與總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08最新評論