最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8-Stream流操作List去重問題

 更新時間:2022年11月11日 15:21:17   作者:徐壽春  
這篇文章主要介紹了Java8-Stream流操作List去重問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java8Stream流操作List去重

根據屬性去重整體去重使用

  • distinct
ArrayList<LabelInfoDTO> collect = labelInfoDTOS.stream().
collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(LabelInfoDTO::getLabelCode))), ArrayList::new));

List列表運用Java8的stream流按某字段去重

問題

項目中經常會遇到列表去重的問題,一般可使用Java8的stream()流提供的distinct()方法:list.stream().distinct()。

list的類型為List<String>、List<Integer>,list里的元素為簡單包裝類型。

或者List<Xxx>,其中Xxx為自定義對象類型,重寫equals和hashCode方法,可根據業(yè)務情況來實現,如id相同即認為對象相等。

有時會遇到這種情況,需要對按對象里的某字段來去重。

例如:

@NoArgsConstructor
@AllArgsConstructor
@Data
class Book {
?
? ? public static Book of(Long id, String name, String createTime) {
? ? ? ? return new Book(id, name, Date.from(LocalDateTime.parse(createTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")).atZone(ZoneId.systemDefault()).toInstant()));
? ? }
?
? ? private Long id;
?
? ? private String name;
?
? ? private Date createTime;
}

現在我們要按name字段來去重,假設list如下:

List<Book> books = new ArrayList<>();
books.add(Book.of(1L, "Thinking in Java", "2021-06-29 17:13:14"));
books.add(Book.of(2L, "Hibernate in action", "2021-06-29 18:13:14"));
books.add(Book.of(3L, "Thinking in Java", "2021-06-29 19:13:14"));

思路

1、重寫B(tài)ook類的equals和hashCode方法,以name來判斷比較是否相同,然后用stream的distinct方法來去重

代碼:

class Book {
? ? ...
?
? ? @Override
? ? public String toString() {
? ? ? ? return String.format("(%s,%s,%s)", id, name, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(createTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()));
? ? }
?
? ? @Override
? ? public boolean equals(Object o) {
? ? ? ? if (this == o) return true;
? ? ? ? if (o == null || getClass() != o.getClass()) return false;
? ? ? ? Book book = (Book) o;
? ? ? ? return Objects.equals(name, book.name);
? ? }
}
?
List<Book> distinctNameBooks1 = books.stream().distinct().collect(Collectors.toList());
System.out.println(distinctNameBooks1);

總結:

通過重寫equals和hashCode方法,按實際需求來比較,可直接使用stream的distinct方法去重,比較方便;

有時對象類不方便或者不能修改,如它已實現好或者是引用的三方包不能修改,該方法不能靈活地按字段來去重。

2、通過Collectors.collectingAndThen的Collectors.toCollection,里面用TreeSet在構造函數中指定字段

代碼:

List<Book> distinctNameBooks2 = books.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getName()))), ArrayList::new));
System.out.println(distinctNameBooks2);

總結:

使用stream流提供的方法,代碼很簡潔,但不足是雖然實現了去重效果,但list里的順序變化了,而有的場景需要保持順序。

3、通過stream的filter方法來去重,定義一個去重方法,參數為Function類型,返回值為Predicate類型

代碼:

public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
? ? Map<Object, Boolean> map = new HashMap<>();
? ? return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
?
List<Book> distinctNameBooks3 = books.stream().filter(distinctByKey(o -> o.getName())).collect(Collectors.toList());
System.out.println(distinctNameBooks3);

總結:

通過封裝定義一個去重方法,配合filter方法可靈活的按字段去重,保持了原列表的順序,不足之處是內部定義了一個HashMap,有一定內存占用,并且多了一個方法定義。

4、通過stream的filter方法來去重,不定義去重方法,在外面創(chuàng)建HashMap

代碼:

Map<Object, Boolean> map = new HashMap<>();
List<Book> distinctNameBooks4 = books.stream().filter(i -> map.putIfAbsent(i.getName(), Boolean.TRUE) == null).collect(Collectors.toList());
System.out.println(distinctNameBooks4);

總結:

仍然是配合filter方法實現去重,沒有單獨創(chuàng)建方法,臨時定義一個HashMap,保持了原列表的順序,不足之處是有一定內存占用。

PS:暫時沒找到stream流原生支持的可按某字段去重并且保持原列表順序的方法

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • SpringBoot整合Mybatis-Plus、Jwt實現登錄token設置

    SpringBoot整合Mybatis-Plus、Jwt實現登錄token設置

    Spring Boot整合Mybatis-plus實現登錄常常需要使用JWT來生成用戶的token并設置用戶權限的攔截器,本文就來詳細的介紹一下,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • MyBatis框架關聯(lián)映射實例詳解

    MyBatis框架關聯(lián)映射實例詳解

    這篇文章主要介紹了MyBatis框架關聯(lián)映射,關系映射主要處理復雜的SQl查詢,如子查詢,多表聯(lián)查等復雜查詢,應用此種需求時可以考慮使用,需要的朋友可以參考下
    2022-11-11
  • idea 修改項目名和module名稱的操作

    idea 修改項目名和module名稱的操作

    這篇文章主要介紹了idea 修改項目名和module名稱的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • MybatisPlus分頁查詢與多條件查詢介紹及查詢過程中空值問題的解決

    MybatisPlus分頁查詢與多條件查詢介紹及查詢過程中空值問題的解決

    mybatisplus是個很好用的插件,相信小伙伴們都知道,下面這篇文章主要給大家介紹了關于mybatis-plus實現分頁查詢與多條件查詢介紹及查詢過程中空值問題的相關資料,需要的朋友可以參考下
    2022-10-10
  • Java項目中大批量數據查詢導致OOM的解決

    Java項目中大批量數據查詢導致OOM的解決

    本文主要介紹了Java項目中大批量數據查詢導致OOM的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 深入淺析Java反射機制

    深入淺析Java反射機制

    Java反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調用對象的方法的功能稱為Java語言的反射機制
    2015-11-11
  • MyBatis游標Cursor的正確使用和百萬數據傳輸的內存測試

    MyBatis游標Cursor的正確使用和百萬數據傳輸的內存測試

    這篇文章主要介紹了MyBatis游標Cursor的正確使用和百萬數據傳輸的內存測試,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot 應用程序測試實現方案

    SpringBoot 應用程序測試實現方案

    這篇文章主要介紹了SpringBoot 應用程序測試實現方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java 設計模式(DAO)的實例詳解

    java 設計模式(DAO)的實例詳解

    這篇文章主要介紹了java 設計模式(DAO)的實例詳解的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • SpringBoot各種事務操作實戰(zhàn)(自動回滾、手動回滾、部分回滾)

    SpringBoot各種事務操作實戰(zhàn)(自動回滾、手動回滾、部分回滾)

    本文主要介紹了SpringBoot各種事務操作實戰(zhàn),包含自動回滾、手動回滾、部分回滾這三種,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05

最新評論

东阳市| 石台县| 库伦旗| 舞阳县| 荔波县| 陈巴尔虎旗| 称多县| 寻乌县| 林口县| 岑巩县| 梧州市| 湘潭县| 乾安县| 黑河市| 黑龙江省| 安泽县| 镇赉县| 南陵县| 沙坪坝区| 延边| 太保市| 伽师县| 临夏市| 西安市| 文安县| 霍州市| 道孚县| 茌平县| 菏泽市| 客服| 会理县| 宁河县| 南郑县| 和政县| 揭阳市| 寻甸| 柳江县| 宜川县| 嵊州市| 承德市| 象州县|