记录一下,利用java新特性 lambda表达式的使用方法,这里主要列举常用的3个(list转map,分组,过滤)
1. list转map
//组装list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "张三"));
userList.add(new User("222", "李四"));
//list转map
Map<String, String> userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName)
);
//value是用户对象时
Map<String, String> userMap2 = userList.stream().collect(
Collectors.toMap(User::getId, a -> a)
);
System.out.println("userMap === " + userMap);
运行结果
userMap === {111=张三, 222=李四}
特殊点:如果key存在相同时
/**
* 注意:如果存在key值相同的,可以用 (k1,k2)->k1 来设置
* (k1,k2)->k1 如果有重复的key,则保留key1,舍弃key2 --- 保留前者
* (k1,k2)->k2 如果有重复的key,则保留key2,舍弃key1 --- 覆盖前者
*/
//组装list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "张三"));
userList.add(new User("222", "李四"));
userList.add(new User("111", "王五"));
userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName, (k1,k2)->k1)
);
System.out.println("userMap k1 === " + userMap);
userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName, (k1,k2)->k2)
);
System.out.println("userMap k2 === " + userMap);
运行结果
userMap k1 === {111=张三, 222=李四}
userMap k2 === {111=王五, 222=李四}
2. 分组
//组装list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "张三"));
userList.add(new User("222", "李四"));
userList.add(new User("111", "王五"));
Map<String, List<User>> userGroupMap = userList.stream().collect(
Collectors.groupingBy(User::getId)
);
System.out.println("userGroupMap === " + userGroupMap);
运行结果
userGroupMap === {111=[User(id=111, name=张三), User(id=111, name=王五)], 222=[User(id=222, name=李四)]}
3. 过滤
//组装list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "张三"));
userList.add(new User("222", "李四"));
userList.add(new User("111", "王五"));
List<User> userFilterList = userList.stream()
.filter(a -> a.getId().equals("111"))
.collect(Collectors.toList());
System.out.println("userFilterList === " + userFilterList);
运行结果
userFilterList === [User(id=111, name=张三), User(id=111, name=王五)]
4. 完整示例代码
- 用户对象
import lombok.Data;
/**
* @author yanghao
* @version User.java, v 0.1 2019-08-22 17:20
*/
@Data
public class User {
/**
* 用户编号
*/
private String id;
/**
* 用户名称
*/
private String name;
/**
* 构造器
* @param id
* @param name
*/
public User(String id, String name){
this.id = id;
this.name = name;
}
}
- 测试类
import org.assertj.core.util.Lists;
import org.junit.Test;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author yanghao
* @version LambdaTest.java, v 0.1 2019-08-22 17:19
*/
public class LambdaTest {
@Test
public void test(){
//组装list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "张三"));
userList.add(new User("222", "李四"));
//1. list转map
Map<String, String> userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName)
);
//value是用户对象时
Map<String, String> userMap2 = userList.stream().collect(
Collectors.toMap(User::getId, a -> a)
);
System.out.println("userMap === " + userMap);
//System.out.println("userMap2 === " + userMap2);
/**
* 注意:如果存在key值相同的,可以用 (k1,k2)->k1 来设置
* (k1,k2)->k1 如果有重复的key,则保留key1,舍弃key2 --- 保留前者
* (k1,k2)->k2 如果有重复的key,则保留key2,舍弃key1 --- 覆盖前者
*/
userList.add(new User("111", "王五"));
userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName, (k1,k2)->k1)
);
System.out.println("userMap k1 === " + userMap);
userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName, (k1,k2)->k2)
);
System.out.println("userMap k2 === " + userMap);
//2. 分组
Map<String, List<User>> userGroupMap = userList.stream().collect(
Collectors.groupingBy(User::getId)
);
System.out.println("userGroupMap === " + userGroupMap);
//3.过滤
List<User> userFilterList = userList.stream()
.filter(a -> a.getId().equals("111"))
.collect(Collectors.toList());
System.out.println("userFilterList === " + userFilterList);
}
}
运行结果
userMap === {111=张三, 222=李四}
userMap k1 === {111=张三, 222=李四}
userMap k2 === {111=王五, 222=李四}
userGroupMap === {111=[User(id=111, name=张三), User(id=111, name=王五)], 222=[User(id=222, name=李四)]}
userFilterList === [User(id=111, name=张三), User(id=111, name=王五)]