java8利用流和lambda表達式對list遍歷處理


java8的lambda表達式提供了一些方便list操作的方法,主要涵蓋分組、過濾、求和、最值、排序、去重。

優點: (1) 簡潔,跟之前的傳統寫法對比,能少寫不少代碼;

   (2) 易並行計算。尤其適用於遍歷結果,循環計算數值或者賦值的時候非常方便。

缺點:(1) debug調試不方便;

   (2) 在非並行時,效率並沒有提高(未測試)

 

使用總結

1.forEach()

  list.forEach(item->{

    //執行邏輯

    //item.setName("測試");

    //item.getName();

  });

2.stream()流操作

  2.1 去重 關鍵字:distinct

    list = list.stream().distinct().collect(Collectors.toList());

  2.2 排序 根據對象的某個屬性排序 關鍵字:sorted

    list = list.stream().sorted(((o1, o2) -> o2.getId()-o1.getId())).collect(Collectors.toList());

    簡化版:  list.sort(((o1, o2) -> {return o2.getId()-o1.getId();}));

      多字段排序:  list.sort(Comparator.comparing(User::getId).thenComparing(User::getAge));

    說明: o2.getId()-o1.getId()的o2和o1的順序決定升序或是降序

  2.3 過濾 根據對象的某個屬性過濾 關鍵字:filter

    list = list.stream().filter(item->item.getId()>5).collect(Collectors.toList());

  2.4 提取 取出對象的某個屬性的集合 關鍵字:map

    List<Integer> idList = list.stream().map(user-> user.getId()).collect(Collectors.toList());

    List<Integer> idList = list.stream().map(User::getId).collect(Collectors.toList());

    說明:提取有兩種寫法 ,第一種是Function表達式,可以加自己的判斷

  2.5 統計 獲取對象某個屬性的平均值 最大最小值登等 關鍵字: mapToDouble() mapToInt()  mapToLong()    average max min sum

    num = list.stream().mapToInt(item -> item.getId()).average();

    num = list.stream().mapToInt(item -> item.getId()).max();

    num = list.stream().mapToInt(item -> item.getId()).min();

    大數據計算:  BigDecimal num= list.stream().map(User::getNum).reduce(BigDecimal.ZERO, BigDecimal::add);  說明: 需要注意null的情況,需要先過濾,或者重寫方法

    若要獲取最值對應的對象:

      Comparator<User> comparator = Comparator.comparing(item -> item.getId);

      User user = list.stream().max(comparator).get();

  2.6 分組 根據對象的某個屬性分組  關鍵字:Collectors.groupingBy

    list.stream().collect(Collectors.groupingBy(item -> item.getId()));

    說明: 還可以多重分組或者是多字段分組或者是統計分組后的某個屬性的最大最小值等 關鍵字:Collectors.summarizingInt

  2.7 轉map

    Map map = list.stream().collect(Collectors.toMap(item -> item.getId(),a -> a,(k1,k2)->k1));

  說明:當key重復時會報錯,所以需要加上 (k1,k2)->k1),表示有重復時,取k1的值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM