List常用操作比for循环更优雅的写法

List users = new ArrayList<>();

for (User u : list) {

if (u.getAge() >= 15 && u.getAge() <= 17) {

users.add(u);

}

}

复制代码

使用lamada表达式写法为:

List users = list.stream()

.filter(u -> u.getAge() >= 15 && u.getAge() <= 17)

.collect(Collectors.toList());

复制代码

获取某属性返回新的List集合


以获取id为例,项目中有时候可能会需要根据用户id的List进行查询或者批量更新操作,这时候就需要用户id的List集合,for循环写法为:

List ids = new ArrayList<>();

for (User u:list) {

ids.add(u.getId());

}

复制代码

lamada表达式写法为:

List ids = list.stream()

.map(User::getId).collect(Collectors.toList());

复制代码

获取以某属性为key,其他属性或者对应对象为value的Map集合


以用户id为key(有时可能需要以用户编号为key),以id对应的user作为value构建Map集合,for循环写法为:

Map<Integer,User> userMap = new HashMap<>();

for (User u:list) {

if (!userMap.containsKey(u.getId())){

userMap.put(u.getId(),u);

}

}

复制代码

lamada表达式写法为:

Map<Integer,User> map = list.stream()

.collect(Collectors.toMap(User::getId,

Function.identity(),

(m1,m2)->m1));

复制代码

Function.identity()返回一个输出跟输入一样的Lambda表达式对象,等价于形如t -> t形式的Lambda表达式。

(m1,m2)-> m1此处的意思是当转换map过程中如果list中有两个相同id的对象,则map中存放的是第一个对象,此处可以根据项目需要自己写。

以某个属性进行分组的Map集合


以部门id为例,有时需要根据部门分组,筛选出不同部门下的人员,如果使用for循环写法为:

Map<Integer,List> departGroupMap = new HashMap<>();

for (User u:list) {

if (departGroupMap.containsKey(u.getDepartId())){

departGroupMap.get(u.getDepartId()).add(u);

}else {

List users1 = new ArrayList<>();

users1.add(u);

departGroupMap.put(u.getDepartId(),users1);

}

}

复制代码

使用lamada表达式写法为:

Map<Integer,List> departGroupMap = list.stream()

.collect(Collectors

.groupingBy(User::getDepartId));

复制代码

其他情况


可以根据需要结合stream()进行多个操作,比如筛选出年龄在15-17岁的用户,并且根据部门进行分组分组,如果使用for循环,代码如下:

Map<Integer,List> departGroupMap = new HashMap<>();

for (User u:list) {

if (u.getAge() >= 15 && u.getAge() <= 17) {

if (departGroupMap.containsKey(u.getDepartId())){

departGroupMap.get(u.getDepartId()).add(u);

}else {

List users1 = new ArrayList<>();

users1.add(u);

departGroupMap.put(u.getDepartId(),users1);

}

}

}

复制代码

使用lamada表达式,代码如下:

Map<Integer,List> departGroupMap = list.stream()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值