从去年开始就经常性用到lambda表达式的代码,部分经常用,如果掌握相关代码用起来非常方便
1.从集合中抽取某一元素的集合
// 抽取一个字段成为新的组合
List<String> list = userService.stream().map(User::getCreateId()).collect(Collectors.toList());
// map形式的抽取
List<String> list = userService.stream().map(e -> e.get("name")).collect(Collectors.toList());
List<String> idList = ProductService.list(new Product().setCreateUserId(nodeUser.getUserId())) .stream().map(t -> t.getProductId()).collect(Collectors.toList());
2.集合去重
List<Product> list = ProductService.list(new Product().setCreateUserId(nodeUser.getUserId())).stream().distinct().collect(Collectors.toList());
2.1集合根据多个字段来去重
// 根据id和年份 两字段去重
List<GoalDetail> goList = goLists.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(goal -> go.getGoId()+";"+goal.getGoYear()))), ArrayList::new));
注: 该集合去重的顺序为把索引靠后的重复那条给去掉
3.双冒号(::)的用法
双冒号(::)在在Java 8中被用作方法引用,例如
实体类字段引用:
wrapper.eq(StringUtils.isNotEmpty(param.getStatus()), Excellent::getStatus, param.getStatus());
遍历实体类的方法如下,三者方法效果一致
1.list.stream().foreach(jdks::prints);
2.list.foreach(jdks::prints);
3.for(int i=0;i<list.size();i++){
System.out.print(list.get(i));
}
双冒号方法的方法引用要在之后的项目开发中实际运用,多多领悟
4.LambdaQueryWrapper和QueryWrapper的用法和区别
LambdaQueryWrapper可以通过lambda获取数据库表的列名
wrapper.eq(StringUtils.isNotEmpty(param.getType()), Excellent::getType, param.getType());
wrapper.eq(StringUtils.isNotEmpty(param.getDate()), Excellent::getApplyDate, param.Date());
QueryWrapper直接写表的列名
wrapper.eq("card_no",request.getParam().getCardNo());
wrapper.orderByAsc("start_date");
5.集合排序
集合排序还是经常可以用到的,根据某一字段的值进行排序,对于sql查询后想要根据某种顺序重新调整尤为方便,例:
// 此为对list进行排序,先正序后加上.reversed()进行倒序排列,不加则为正序
List<SysDept> depts = deptList.stream().sorted(Comparator.comparing(Dept::getOrder).reversed()).collect(Collectors.toList());
// 直接进行倒序排列
List<SysDept> depts = deptList.stream().sorted(Comparator.comparing(Dept::getOrder, Comparator.reverseOrder())).collect(Collectors.toList());
// 多字段排序
List<SysDept> depts = deptList.stream().sorted(Comparator.comparing(Dept::getOrder, Comparator.reverseOrder().thenComparing(Dept::getId))).collect(Collectors.toList());
// 排序后抽取其中一个字段来组成新的集合
List<String> valueList = resultList.stream().sorted(Comparator.comparing((Map<String, Object> e) -> (BigDecimal) e.get("amount")).reversed()).map(e -> String.valueOf(e.get("value"))).collect(Collectors.toList());
5.1 键值对集合抽取元素来排序
//List<Map>抽取相对复杂一点,从json中抽取元素
List<Map<String, Object>> list1 = list.stream().sorted(Comparator.comparing(map -> JSONObject.parseObject(JSON.toJSONString(map)).getInteger("num"))).collect(Collectors.toList());
6.条件抽取
filter里面设置相关条件来得到相关集合
// 从人员列表中抽取性别为男生集合
List<User> manList = users.stream().filter(a -> a.getSex().equals(CommonConstants.ONE)).collect(Collectors.toList());
// 从map中抽取name不为空的集合
list.stream().filter((Map<String,Object>a) -> StringUtils.isNotBlank(a.get("name"))).collect(Collectors.toList())
7.集合中某一字段相加求和
常常需要把集合的某一列如BigDecimal、integer的值求和,如下:
// BigDecimal的分数一列的值求和
BigDecimal intotalSorce = scorelist.stream().map(ScoreRecord::getScore).reduce(BigDecimal.ZERO, BigDecimal::add);
// Inteter的分数一列的值求和
Integer allSum = list.stream().mapToInt(e -> StringUtils.isNotBlank(e.getLevel()) ? Integer.parseInt(e.getLevel()) : 0).sum();
// map中的BigDecimal 元素求和
BigDecimal totalNumber = list.stream().map(map -> JSONObject.parseObject(JSON.toJSONString(map)).getBigDecimal("number")).reduce(BigDecimal::add).get();
// map中的Integer 元素求和
Integer typeCount = list.stream().collect(Collectors.summingInt(map -> JSONObject.parseObject(JSON.toJSONString(map)).getInteger("typeCount")));
8.集合中抽取其中两个+字段和值组成一个map
抽取两个+字段组成新的list的稍后补充
// 取出的多个字段组成的map格式
Map<String, Integer> subejctMap = subjectList.stream().collect(Collectors.toMap(Subject::getName, Subject::getClockNumber));