...... 一个只会使用java的男人
一、现在绝大部分web项目组jdk都升级到了1.8,那么1.8开始引入的lambda表达式确实也带了很大便利,今天将总结lambda表达式的常用示例。
Student student1 = new Student().setId(1L).setName("张三").setCore(60).setGender(1).setTeacherId(2L);
Student student2 = new Student().setId(2L).setName("ben").setCore(90).setGender(2).setTeacherId(3L);
Student student3 = new Student().setId(3L).setName("anny").setCore(100).setGender(2).setTeacherId(2L);
1、stream转换为集合,我们可以不再一个一个的add了。
List<Student> students = Stream.of(student1, student2, student3).collect(Collectors.toList());
2、map对象转换,我们一般从数据库查数据为PO对象,返回给web端时一般为VO对象,那么这其中就涉及对象转换返回,map就提供了便利的操作。
List<StudentVo> studentVos = students.stream().map(student -> {
StudentVo studentVo = new StudentVo();
BeanUtils.copyProperties(student, studentVo);
return studentVo;
}).collect(Collectors.toList());
这样就很方便的转成另一个对象。
3、peek用法,用法同map一样,不同的是不需要return返回值。
List<Student> studentVos = students.stream().peek(student -> student.setDeleted(false)).collect(Collectors.toList());
我们可能只是为了修改对象的属性,我们无须使用map。
4、filter 过滤器,可以为我们过滤掉符合条件的数据
List<Student> filters = students.stream().filter(Student::getDeleted).collect(Collectors.toList());
这样,我们就过滤掉了被删除的学生,返回未被删除的学生集合。
5、sort排序,我们经常会遇到按某个属性值排序的需求。
List<Student> collect = students.stream().sorted(Comparator.comparing(Student::getCore).reversed())
.sorted(Comparator.comparing(Student::getGender)).collect(Collectors.toList());
这是一个连续排序的例子,按学生分数倒叙,分数相同按照性别排序,reversed()表示倒叙,是不是感觉完全实现了sql的功能。
6、sort排序扩展,我们经常会遇到按照指定集合排序。比如我们有一个排好序的学生id集合,返回的数据也需要按照给定集合返回
List<Long> webIds = new ArrayList<Long>(){{
add(2L); add(1L); add(3L);
}};
List<Student> webSortList = students.stream().sorted(Comparator.comparing(student -> {
int index = webIds.indexOf(student.getId());
if (index != -1) {
return index - Long.MAX_VALUE;
}
return (long) index;
}, Long::compareTo)).collect(Collectors.toList());
我们不需要去写一堆的循环程序,提供了很大的便利。
7、min、max等,求最小,最大,平均、求和等是一样的使用方法,这里就一起举例。
int min = students.stream().mapToInt(Student::getCore).min().orElse(-1);
int max = students.stream().mapToInt(Student::getCore).max().orElse(-1);
int sum = students.stream().mapToInt(Student::getCore).sum();
double average = students.stream().mapToInt(Student::getCore).average().orElse(-1);
8、分组,既然有聚合,那就有分组,比如我们需要按照性别进行分组。
Map<Integer, List<Student>> genderGroup
= students.stream().collect(Collectors.groupingBy(Student::getGender, Collectors.toList()));
当然,分组里边还可以再分组。
9、Collectors.toMap()常用方式,比如我们需要形成姓名和分数的一个json
Map<String, Integer> nameScore = students.stream().collect(Collectors.toMap(Student::getName, Student::getCore));
这里只是举例,不考虑姓名重复问题。
如果要是行id对应自身对象呢?
Map<String, Student> nameStudent = students.stream().collect(Collectors.toMap(Student::getName, Function.identity()));
10、list初始化成map,有时我们未了避免空指针问题,会提前初始化一个map
Map<Long, List<Student>> init = webIds.stream().collect(Collectors.toMap(el -> el, el -> new ArrayList<>()));
9和10都是一些比较常用的list转map的用法。
常用的就是这些,遗漏的欢迎留言补充。