lambda表达式分组,过滤,求和,最值,排序,去重
⽂章⽬录
简介
java8的lambda表达式提供了⼀些⽅便list操作的⽅法,主要涵盖分组、过滤、求和、最值、排序、去重。跟之前的传统写法对⽐,能少写不少代码。
实例
先准备个实体类
import java.math.BigDecimal;
import java.util.Date;
public class User {
private long id;
//姓名
bigdecimal转换为integerprivate String name;
//年龄
private int age;
//⼯号
private String jobNumber;
//性别
private int gender;
//⼊职⽇期
private Date entryDate;
//钱
private BigDecimal money;
/
/省略get set
...
}
分组
通过groupingBy将集合分组拆分成多个集合
//通过年龄分组、得到⼀个以年龄为键,⽤户集合为值的Map集合
Map<Integer,List<User>> groupByAge = userList.stream().upingBy(User::getAge));
过滤
通过filter⽅法可以过滤某些条件
//过滤
//排除掉⼯号为1001的⽤户
//filter内添加条件、保留返回true的实例
List<User> list = userList.stream().filter(user ->!JobNumber().equals("1001")).List());
求和
分基本类型和⼤数类型求和,基本类型先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<Usrt> list = userList.stream().filter(user -> null != user).List());
//再求和
BigDecimal totalMoney = userList.stream().map(User::getMoney).reduce(BigDecimal.ZERO,BigDecimal::add);
2、或者可以重写求和⽅法
package com.jamesluozhiwei.util;
import java.math.BigDecimal;
public class BigDecimalUtils {
/**
* 如果为null就返回0
* @param in
* @return
*/
public static BigDecimal ifNullSet0(BigDecimal in){
if(in != null){
return in;
}
return BigDecimal.ZERO;
}
/**
* 求和
* @param in
* @return
*/
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
/**
* List -> Map
* 需要注意的是:
* toMap 如果集合对象有重复的key,会报错Duplicate key ....
* user1,user2的id都为1。
* 可以⽤ (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
*/
Map<Long, User> userMap = userList.stream().Map(User::getId, user -> user,(k1,k2)->k1));排序
可通过Sort对单字段多字段排序
//排序
//单字段排序,根据id排序
userList.sort(Comparatorparing(User::getId));
//多字段排序,根据id,年龄排序
userList.sort(Comparatorparing(User::getId).thenComparing(User::getAge));
去重
通过distinct⽅法进⾏去重
//去重
List<Long> idList =new ArrayList<Long>();
idList.add(1L);
idList.add(1L);
idList.add(2L);
List<Long> distinctIdList = idList.stream().distinct().List());
获取list对象某个字段组装新的list
/
/获取list对象的某个字段组装成新list
List<Long> userIdList = userList.stream().map(a -> a.getId()).List());
批量设置list列表字段为同⼀个值
addList.stream().forEach(a -> a.setMoney("0"));

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。