java8的lambda用法总结(持续更新)

从去年开始就经常性用到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));

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值