Java Stream 结合Lambda表达式在Java项目开发中常见的数据结构转换
Stream是jdk1.8的新特性,可以结合lambda表达式结合使用,可以提高开发效率和性能
// 定义一个User对象
@Data
public class User{
private Integet id;
private Integet userId;
private String name;
private Integer age;
private Double timeSpan;
}
1. 提取User类型的List对象userList中的Id属性作为新的List
代码如下(示例):
// distinct()对Id进行去重
List<Integer> ids = userList.stream().map(User::getId).distinct().collect(Collectors.toList());
其实现类似于:
List<Integer> ids = new ArrayList<>();
for (User user : userList) {
ids.add(user.getId())
// 省略去重操作
}
2.将User类型的List对象转为属性Id为Key,User对象为Value的Map集合
代码如下(示例):
Map<Integer, User> userMap = userList.stream().collect(Collectors.toMap(User::getId,user->user,(k1,k2)->k1));
// 其实现原理也是类似于for循环中往map 添加值,(k1,k2)->k1表示出现重复键,则保留k1和k2中的k1
3.将User类型的List对象转为属性Id和userId的组合为Key,User对象为Value的Map集合
代码如下(示例):
Map<String,User> userMap = userList.stream().collect(Collectors.toMap(user-> user.getId() + "_" + user.getUserId(), user-> user,(k1, k2)->k1));
4.使用groupingBy根据User实体中某个属性对List进行分组
代码如下(示例):
Map<Integer,List<User>> map = userList.stream().collect(Collectors.groupingBy(User::getAge(), Collectors.toList()))
结合Lambda表达式可以书写为:
Map<Integer,List<User>> map = userList.stream().collect(Collectors.groupingBy(user -> user.getAge()))
5.使用stream.max()和stream.min()获取List中的最大值和最小值
List<Integer> list = new ArrayList();
list.stream().max(Integer::compareTo).orElse(0);
list.stream().min(Integer::compareTo).orElse(0);
// 也可以使用get(),但不建议使用,有可能会抛option为空的异常
list.stream().max(Integer::compareTo).get;
6.使用stream().mapToDouble()进行数值统计
Double span = userList.stream().mapToDouble(User::getTimeSpan).sum();
7.使用stream.filter()结合Lambda表达式进行List过滤
List<Integer> ids = new ArrayList();
ids.add(1);
ids.add(2);
List <User> userList2 = userList.stream().filter(ids.contains(user.getAge())).collect(Collectors.toList());