java中stream去重的幾種方式舉例
使用 Stream 的 distinct() 方法
這個(gè)方法會(huì)根據(jù)元素的 hashCode() 和 equals() 方法來(lái)判斷是否重復(fù)。如果是自定義的類,需要重寫(xiě)這兩個(gè)方法。
示例:
//利用java8的stream去重 List uniqueList = list.stream() .distinct() .collect(Collectors.toList()); System.out.println(uniqueList.toString());
使用 collectingAndThen() 和 toCollection() 方法
這個(gè)方法可以根據(jù)元素的某個(gè)屬性或者多個(gè)屬性來(lái)去重,比如 name 或者 name+address。這個(gè)方法會(huì)使用 TreeSet 來(lái)排序元素,所以不能保持原來(lái)的順序。
示例:
//根據(jù)name屬性去重 List<User> lt = list.stream().collect( collectingAndThen( toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))), ArrayList::new) ); System.out.println("去重后的:" + lt);
使用 filter() 方法
這個(gè)方法需要自定義一個(gè) Predicate 函數(shù),用一個(gè) Set 來(lái)記錄已經(jīng)出現(xiàn)過(guò)的元素,然后過(guò)濾掉重復(fù)的元素。
示例:
//定義一個(gè)Predicate函數(shù) private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { Set<Object> seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); } //根據(jù)age屬性去重 list.stream().filter(distinctByKey(s -> s.getAge())) .forEach(System.out::println);
補(bǔ)充知識(shí):自定義去重
如何采用stream進(jìn)行自定義去重呢?
我們以age字段為例,進(jìn)行去重
預(yù)期結(jié)果
總結(jié)
到此這篇關(guān)于java中stream去重的幾種方式的文章就介紹到這了,更多相關(guān)java stream去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java String 轉(zhuǎn)成Double二維數(shù)組的方法
下面小編就為大家?guī)?lái)一篇java String 轉(zhuǎn)成Double二維數(shù)組的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10【MyBatis源碼全面解析】MyBatis一二級(jí)緩存介紹
下面小編就為大家?guī)?lái)一篇【MyBatis源碼全面解析】MyBatis一二級(jí)緩存介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06IDEA中SpringBoot項(xiàng)目的yml多環(huán)境配置方式
這篇文章主要介紹了IDEA中SpringBoot項(xiàng)目的yml多環(huán)境配置,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-10-10java8新特性將List中按指定屬性排序過(guò)濾重復(fù)數(shù)據(jù)的方法
這篇文章主要介紹了java8新特性將List中按指定屬性排序過(guò)濾重復(fù)數(shù)據(jù)的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08SpringBoot項(xiàng)目打包部署到Tomcat的操作流程
在最近一個(gè)項(xiàng)目中,維護(hù)行里一個(gè)年代較為久遠(yuǎn)的單體項(xiàng)目,需要將項(xiàng)目打包放到的tomcat服務(wù)器下運(yùn)行,所以本文就給大家介紹一下SpringBoot項(xiàng)目打包部署到Tomcat的流程步驟,需要的朋友可以參考下2023-08-08SpringBoot優(yōu)化啟動(dòng)速度的方法實(shí)現(xiàn)
本篇文章主要介紹了SpringBoot優(yōu)化啟動(dòng)速度的方法實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01spring注解如何為bean指定InitMethod和DestroyMethod
這篇文章主要介紹了spring注解如何為bean指定InitMethod和DestroyMethod,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11java手動(dòng)實(shí)現(xiàn)常見(jiàn)數(shù)據(jù)結(jié)構(gòu)的示例代碼
本文介紹了Java中常用數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)和Java實(shí)現(xiàn),包括數(shù)組、動(dòng)態(tài)數(shù)組、鏈表、棧、隊(duì)列、哈希表、樹(shù)、堆、圖、集合、雙向隊(duì)列以及自定義鏈表,幫助開(kāi)發(fā)者選擇合適的數(shù)據(jù)結(jié)構(gòu)以提升代碼效率,感興趣的朋友一起看看吧2025-02-02