爱生活、爱运动、爱分享、爱折腾、爱编程。

lambda表达式list操作分组、过滤、求和、最值、排序、去重

1.分组

通过groupingBy可以分组指定字段

//分组
Map<String, List<User>> groupBySex = userList.stream().collect(Collectors.groupingBy(User::getSex));
//遍历分组
for (Map.Entry<String, List<User>> entryUser : groupBySex.entrySet()){
    String key = entryUser.getKey();
    List<User> entryUserList = entryUser.getValue();
}

2.过滤

通过filter方法可以过滤某些条件

//过滤掉年龄为25的用户
List<User> userCommonList = userList.stream().filter(a ->a.getAge()!=25).collect(Collectors.toList());

3.求和

分基本类型和大数类型求和,基本类型先mapToInt,然后调用sum方法,大数类型使用reduce调用BigDecimal::add方法

//求和
//基本类型
int sumAge = userList.stream().mapToInt(User::getAge).sum();
//BigDecimal求和
BigDecimal totalAge = userList.stream().map(User::getAge).reduce(BigDecimal.ZERO, BigDecimal::add);

上面的求和不能过滤BigDecimal对象为null的情况,可能会报空指针,这种情况,我们可以用filter方法过滤,或者重写求和方法

public static BigDecimal ifNullSetZero(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(ifNullSetZero(in[i]));
    }
    return result;
}
BigDecimal totalAge2 = userList.stream().map(User::getAge).reduce(BigDecimal.ZERO,BigDecimalUtils::sum);

判断对象空

stream.filter(x -> x!=null)
stream.filter(Objects::nonNull)

判断字段空

stream.filter(x -> x.getDateTime()!=null)

4.最值

求最小与最大,使用min max方法

    //最小
Date minEntryDate = userList.stream().map(User::getEntryDate).min(Date::compareTo).get();

//最大
Date maxEntryDate = userList.stream().map(User::getEntryDate).max(Date::compareTo).get();

5.List 转map

     /**
     * List -> Map
     * 需要注意的是:
     * toMap 如果集合对象有重复的key,会报错Duplicate key ....
     *  user1,user2的id都为1。
     *  可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
     */
Map<Long, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, a -> a,(k1,k2)->k1));

6.排序

可通过Sort对单字段多字段排序

//单字段排序,根据id排序
userList.sort(Comparator.comparing(User::getId));
//多字段排序,根据id,年龄排序
userList.sort(Comparator.comparing(User::getId).thenComparing(User::getAge));

7.去重

//去重
List<Long> idList = new ArrayList<Long>();
idList.add(1L);
idList.add(1L);
idList.add(2L);
idList.add(3L);
List<Long> distinctIdList = idList.stream().distinct().collect(Collectors.toList());

8.获取list某个字段组装新list

//获取list对象的某个字段组装成新list
List<Long> userIdList = userList.stream().map(a ->a.getUsername()).collect(Collectors.toList());

9.批量设置list列表字段为同一个值

addList.stream().forEach(a -> a.setAge(0));
赞(1)
(转载本站文章请注明作者和出处 ,请勿用于任何商业用途)Mydrn爱生活爱分享 » lambda表达式list操作分组、过滤、求和、最值、排序、去重

评论 抢沙发

评论前必须登录!