亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java?Stream去重常見的多種方法及示例

 更新時(shí)間:2025年04月12日 10:59:42   作者:碼農(nóng)界趙子龍  
這篇文章主要介紹了Java?Stream中實(shí)現(xiàn)去重的多種方法,包括使用distinct()、Collectors.toMap、filter和groupingBy等,詳細(xì)說明了每種方法的應(yīng)用場(chǎng)景和示例代碼,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

在Java Stream中實(shí)現(xiàn)去重有多種方法,具體取決于需求和場(chǎng)景。以下是常見的幾種方法及示例:

1. 使用 distinct() 方法

適用于對(duì)象已正確實(shí)現(xiàn) equals() 和 hashCode(),基于對(duì)象整體去重并保留順序:

List<Person> uniquePersons = persons.stream()
                                    .distinct()
                                    .collect(Collectors.toList());

2. 根據(jù)對(duì)象的屬性去重

方法一:使用 Collectors.toMap

根據(jù)屬性作為鍵,保留第一個(gè)或最后一個(gè)元素,支持順序(使用 LinkedHashMap):

// 保留第一個(gè)出現(xiàn)的元素
List<Person> uniqueByName = persons.stream()
    .collect(Collectors.toMap(
        Person::getName,
        Function.identity(),
        (oldP, newP) -> oldP, // 保留舊值(第一個(gè))
        LinkedHashMap::new    // 保持插入順序
    ))
    .values().stream()
    .collect(Collectors.toList());

// 保留最后一個(gè)出現(xiàn)的元素
List<Person> uniqueByNameLast = persons.stream()
    .collect(Collectors.toMap(
        Person::getName,
        Function.identity(),
        (oldP, newP) -> newP  // 保留新值(最后一個(gè))
    ))
    .values().stream()
    .collect(Collectors.toList());

方法二:使用 filter 和線程安全的 Set

適用于并行流,但可能不保留順序:

// 并行流去重(不保證順序)
Set<String> seen = ConcurrentHashMap.newKeySet();
List<Person> uniqueByName = persons.parallelStream()
    .filter(p -> seen.add(p.getName()))
    .collect(Collectors.toList());

// 順序流去重(保留順序)
Set<String> seenOrdered = new HashSet<>();
List<Person> uniqueByNameOrdered = persons.stream()
    .filter(p -> seenOrdered.add(p.getName()))
    .collect(Collectors.toList());

方法三:使用 groupingBy

分組后取每組的第一個(gè)元素,保持順序:

List<Person> uniqueByName = persons.stream()
    .collect(Collectors.groupingBy(
        Person::getName,
        LinkedHashMap::new,    // 保持插入順序
        Collectors.toList()
    ))
    .values().stream()
    .map(group -> group.get(0)) // 取第一個(gè)元素
    .collect(Collectors.toList());

3. 根據(jù)字符串長(zhǎng)度去重示例

List<String> words = Arrays.asList("apple", "banana", "orange", "grape", "kiwi");
List<String> uniqueByLength = words.stream()
    .collect(Collectors.toMap(
        String::length,
        Function.identity(),
        (oldVal, newVal) -> oldVal,
        LinkedHashMap::new
    ))
    .values().stream()
    .collect(Collectors.toList());
// 結(jié)果: ["apple", "banana", "kiwi"](保留順序)

4. 自定義去重借助Filter 實(shí)現(xiàn):

自定義一個(gè) Predicate 函數(shù),用一個(gè) Set 來記錄已經(jīng)出現(xiàn)過的元素,然后過濾掉重復(fù)的元素。

//定義一個(gè)Predicate函數(shù)
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Set<Object> sets = ConcurrentHashMap.newKeySet();
    return t -> sets.add(keyExtractor.apply(t));
}

//根據(jù)age屬性去重
list.stream().filter(distinctByKey(s -> s.getAge()))
        .forEach(System.out::println);

附:java中使用stream流根據(jù)對(duì)象中的某一字段進(jìn)行去重

在開發(fā)中經(jīng)常會(huì)遇到數(shù)據(jù)去重的,單個(gè)基本類型的集合去重比較容易,比如String、Integer,直接使用流中的distinct方法去重即可。但是遇到對(duì)象集合,需要使用對(duì)象中的某個(gè)字段去重就不能使用這個(gè)方法了??梢栽诹魇骄幊讨屑尤隩reeSet,TreeSet是一個(gè)有序且不重復(fù)的有序集合。以用戶User數(shù)據(jù)位列:

List<User> list = userService.list();
        list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing( f -> f.getDeptName()+":"+f.getStatus()))),ArrayList::new));

這里是根據(jù)用戶的部門以及用戶的狀態(tài)進(jìn)行數(shù)據(jù)去重,將用戶的部門以及狀態(tài)拼接位一個(gè)字符串進(jìn)行去重,這樣stream內(nèi)部會(huì)將整個(gè)user集合數(shù)據(jù)組裝成這樣進(jìn)行整體去重,這樣去重下來的數(shù)據(jù)就是,每一個(gè)部門中只會(huì)存在一個(gè)狀態(tài)的部門人員數(shù)據(jù),這里是舉個(gè)例子,在實(shí)際環(huán)境中,你可以將User換成自己想要去重的實(shí)體集合。

總結(jié)

  • distinct():簡(jiǎn)單高效,適用于對(duì)象整體去重。
  • toMap 或 groupingBy:靈活,支持按屬性去重,可控制保留順序。
  • filter + Set:適合并行流,但需注意線程安全和順序問題。

根據(jù)具體場(chǎng)景選擇最合適的方法,確保代碼簡(jiǎn)潔且性能良好。

到此這篇關(guān)于Java Stream去重常見的多種方法及示例的文章就介紹到這了,更多相關(guān)Java Stream去重方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中的@ConditionalOnProperty注解使用詳解

    Spring中的@ConditionalOnProperty注解使用詳解

    這篇文章主要介紹了Spring中的@ConditionalOnProperty注解使用詳解,在 spring boot 中有時(shí)候需要控制配置類是否生效,可以使用 @ConditionalOnProperty 注解來控制 @Configuration 是否生效,需要的朋友可以參考下
    2024-01-01
  • IDEA運(yùn)行SSM項(xiàng)目的超詳細(xì)圖解教程

    IDEA運(yùn)行SSM項(xiàng)目的超詳細(xì)圖解教程

    SSM項(xiàng)目部署其實(shí)很簡(jiǎn)單,下面這篇文章主要給大家介紹了關(guān)于IDEA運(yùn)行SSM項(xiàng)目的超詳細(xì)圖解教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • SpringMVC框架實(shí)現(xiàn)圖片上傳與下載

    SpringMVC框架實(shí)現(xiàn)圖片上傳與下載

    這篇文章主要為大家詳細(xì)介紹了SpringMVC框架實(shí)現(xiàn)圖片上傳與下載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java?中的?clone(?)?和?new哪個(gè)效率更高

    Java?中的?clone(?)?和?new哪個(gè)效率更高

    很多朋友不太清楚clone()和new那個(gè)更快?針對(duì)這個(gè)問題我百度了好多資料,最終小編總結(jié)下關(guān)于Java?中的?clone(?)?和?new哪個(gè)效率更高的問題,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Java實(shí)現(xiàn)批量查找與替換Excel文本的思路詳解

    Java實(shí)現(xiàn)批量查找與替換Excel文本的思路詳解

    在 Java 中,可以通過find和replace的方法來查找和替換單元格的數(shù)據(jù),下面小編將以Excel文件為例為大家介紹如何實(shí)現(xiàn)Excel文件內(nèi)容的批量替換,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Java的Struts2框架配合Ext JS處理JSON數(shù)據(jù)的使用示例

    Java的Struts2框架配合Ext JS處理JSON數(shù)據(jù)的使用示例

    這篇文章主要介紹了Java的Struts2框架配合Ext JS處理JSON數(shù)據(jù)的使用示例,包括將Ext JS中的JSON數(shù)據(jù)解析為列表的方法,需要的朋友可以參考下
    2016-03-03
  • sharding-jdbc中的事務(wù)詳細(xì)解讀

    sharding-jdbc中的事務(wù)詳細(xì)解讀

    這篇文章主要介紹了sharding-jdbc中的事務(wù)詳細(xì)解讀,sharding-jdbc在分庫分表方面提供了很大的便利性,在使用DB的時(shí)候,通常都會(huì)涉及到事務(wù)這個(gè)概念,而在分庫分表的環(huán)境上再加上事務(wù),就會(huì)使事情變得復(fù)雜起來,需要的朋友可以參考下
    2023-12-12
  • SpringBoot中忽略實(shí)體類中的某個(gè)屬性不返回給前端的方法(示例詳解)

    SpringBoot中忽略實(shí)體類中的某個(gè)屬性不返回給前端的方法(示例詳解)

    本文介紹了在Spring Boot中使用Jackson和Fastjson忽略實(shí)體類屬性不返回給前端的方法,在Jackson中,同時(shí)使用@JsonProperty和@JsonIgnore時(shí),@JsonIgnore可能失效,Fastjson中可以使用@JSONField(serialize=false)來實(shí)現(xiàn),本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧
    2024-11-11
  • MyBatis新增數(shù)據(jù)時(shí)自增id的兩種寫法小結(jié)

    MyBatis新增數(shù)據(jù)時(shí)自增id的兩種寫法小結(jié)

    本文介紹了在MyBatis中配置自增ID的兩種方法:一種是通過在Mapper文件中設(shè)置useGeneratedKeys和keyProperty,另一種是使用selectKey標(biāo)簽,批量插入時(shí),同樣采用useGeneratedKeys標(biāo)簽,感興趣的可以了解一下
    2024-09-09
  • 關(guān)于springboot加載yml配置文件的no字段自動(dòng)轉(zhuǎn)義問題

    關(guān)于springboot加載yml配置文件的no字段自動(dòng)轉(zhuǎn)義問題

    這篇文章主要介紹了關(guān)于springboot加載yml配置文件的no字段自動(dòng)轉(zhuǎn)義問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評(píng)論