@[TOC]
簡介
java8的lambda表達式提供了一些友善list操作的方法,主要涵蓋分組、過濾、求和、最值、排序、去重。跟之前的傳統寫法對比,能少寫不少代碼。
執行個體
先準備個實體類
import java.math.BigDecimal;
import java.util.Date;
public class User {
private long id;
//姓名
private String name;
//年齡
private int age;
//工号
private String jobNumber;
//性别
private int gender;
//入職日期
private Date entryDate;
//錢
private BigDecimal money;
//省略get set
...
}
分組
通過groupingBy将集合分組拆分成多個集合
//通過年齡分組、得到一個以年齡為鍵,使用者集合為值的Map集合
Map> groupByAge = userList.stream().collect(Collectors.groupingBy(User::getAge));
過濾
通過filter方法可以過濾某些條件
//過濾
//排除掉工号為1001的使用者
//filter内添加條件、保留傳回true的執行個體
List list = userList.stream().filter(user -> !user.getJobNumber().equals("1001")).collect(Collectors.toList());
求和
分基本類型和大數類型求和,基本類型先mapToInt,然後調用sum方法,大數類型使用reduce調用BigDecimal::add方法
//求和
//基本類型
int sumAge = userList.stream().mapToInt(User::getAge).sum();
//BigDecimal求和
BigDecimal totalMoney= userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
注意:在上述BigDecimal類型求和中,如果對象為null則會抛出空指針異常
1、我們可以先試用filter方法進行過濾
//先過濾掉為null的
List list = userList.stream().filter(user -> null != user).collect(Collectors.toList());
//再求和
BigDecimal totalMoney = userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO,BigDecimal::add);
2、或者可以重寫求和方法
package com.jamesluozhiwei.util;
import java.math.BigDecimal;
public class BigDecimalUtils {
public static BigDecimal ifNullSet0(BigDecimal in) {
if (in != null) {
return in;
}
return BigDecimal.ZERO;
}
public static BigDecimal sum(BigDecimal ...in){
BigDecimal result = BigDecimal.ZERO;
for (int i = 0; i < in.length; i++){
result = result.add(ifNullSet0(in[i]));
}
return result;
}
}
重寫求和方法後
//使用重寫的方法求和
BigDecimal totalMoney = userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO,BigDecimalUtils::sum);
最值
求最大與最小值,使用min max方法
//最小
Date minEntryDate = userList.stream().map(User::getEntryDate).min(Date::compareTo).get();
//最大
Date maxEntryDate = userList.stream().map(User::getEntryDate).max(Date::compareTo).get();
List轉Map
Map userMap = userList.stream().collect(Collectors.toMap(User::getId, user -> user,(k1,k2)->k1));
排序
可通過Sort對單字段多字段排序
//排序
//單字段排序,根據id排序
userList.sort(Comparator.comparing(User::getId));
//多字段排序,根據id,年齡排序
userList.sort(Comparator.comparing(User::getId).thenComparing(User::getAge));
去重
通過distinct方法進行去重
//去重
List idList = new ArrayList();
idList.add(1L);
idList.add(1L);
idList.add(2L);
List distinctIdList = idList.stream().distinct().collect(Collectors.toList());
擷取list對象某個字段組裝新的list
//擷取list對象的某個字段組裝成新list
List userIdList = userList.stream().map(a -> a.getId()).collect(Collectors.toList());
批量設定list清單字段為同一個值
addList.stream().forEach(a -> a.setMoney("0"));
注意:本文歸作者所有,未經作者允許,不得轉載