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的值