关于jdk1.8的lamda表达式的常用规则一

最近公司用的jdk1.8,然后不懂lamda表达式的一些常用规范 导致又是问人 又是百度的 磕磕绊绊 总算是用这个jdk1.8的新功能把任务完成了 后续还会陆续总结jdk1.8使用的心得和技巧

一.首先就是for循环的元素提取变了 新的写法是这样的(简单举个例子)

qurryList.forEach(test->list.add(TransactionRecordUtils.copyPotentialCommoditAnalysis(test)));

格式是:List.stream().forEach(循环体->{函数式});单个list链时 .stream()可以省略 我们可以看一下forEach()的底层代码

 default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

发现 其实就是封装了一个fo函数 所以 用foreach和for的效果在数据量少的时候几乎一样

二.对一个list中某个特定的元素求和的两种写法(我目前就用这两种 后续再添加 )

假设这个字段的类型是long类型 

第一种写法:

Long clinchNum = entryUserList.stream().mapToLong(PotentialCommoditAnalysisRankingVO::getClinchNum).sum();

格式:List.stream().mapToLong(list中单个对象的名字::get计算的字段).sun();

返回的结果是个long类型 如果计算的类型是 int类型 直接把mapToLong改成mapToInt或者mapTOdouble类型即可

第二种写法

entryUserList.stream().map(PotentialCommoditAnalysisRankingVO::getTotalPrice).reduce(0L,(a,b)->a+b);

格式:list.stream().map(list中单个对象的名字::get计算的字段).reduce(从0开始叠加,叠加的方式);

lamda表达式的一个好处是可以在java中引入计算规则 也是自己设置一个函数 和上面一样 因为long类型的加法使用+符号的 所以直接在reduce的第二个参数上写了一个函数 定义了一下叠加的方式 

这种方式和第一种相比永远不为空 因为第二种是从0开始叠加的 最下是0 

三 把一个list按照某个字段进行排序

rowList =groupSumByclinchNumResult.stream().sorted(Comparator.comparing(PotentialCommoditAnalysisRankingVO::getClinchNum).reversed()).collect(Collectors.toList());

格式:list.stream().sorted(Comparator.comparing(list中对象名字::get排序字段).revered()).collect(Collectors.toList());

其中.collect(Collectors.toList())是把排序后的流转成list 所以返回结果是个已经排序好的list

四.对一个list按照一个特定的字段分组(个人认为这个比较绕 细心看!)

/按照商品名称分组
            Map<String, List<PotentialCommoditAnalysisRankingVO>> groupByTitle = list.stream().collect(Collectors.groupingBy(PotentialCommoditAnalysisRankingVO::getTitle));
            List<PotentialCommoditAnalysisRankingVO> groupSumByclinchNumResult= Lists.newArrayList();
            //对商品订单量进行求和
            for (Map.Entry<String, List<PotentialCommoditAnalysisRankingVO>> entryUser : groupByTitle.entrySet()) {
                PotentialCommoditAnalysisRankingVO newPCA=new PotentialCommoditAnalysisRankingVO();
                String key = entryUser.getKey();
                List<PotentialCommoditAnalysisRankingVO> entryUserList = entryUser.getValue();
                Long clinchNum = entryUserList.stream().mapToLong(PotentialCommoditAnalysisRankingVO::getClinchNum).sum();
                //entryUserList.stream().map(PotentialCommoditAnalysisRankingVO::getTotalPrice).reduce(0L,(a,b)->a+b);
                newPCA.setTitle(key).setClinchNum(clinchNum);
                groupSumByclinchNumResult.add(newPCA);
            }
 

首先分组的格式是:list.stream().collect(Collectors.groupingBy(list中的对象名字::get的分组字段);

它的返回结果是一个Map  这个map中的key就是分组字段分的每一个组的名字,而这个value就是该组对应的组内该字段的list集合

举个栗子:list[{小飞,出生月5月},{小阳,出生月5月},{小凯,出生月7月},{小红,出生月9月}]  我按照出生月进行分组 得到的map里面有三组值 这个map的key就是月份 有三个 每一个key对应的value是个list集合 这里面放着该月份下的list集合 之所以采用这种结构 因为在实际开发中不可能单纯的分个组 要对分组后的每一组的元素进行处理 比如说求和 这时候只需要把循环该map 然后取出list操作就行啦 我上面的代码就是分组后求和 可以参考下;

四 sql查询语句的优化

我公司一般用的基本查询 基本的逻辑都是逆向工程生成代码 后期通过构造LamdaQueryWrapper进行加条件 然后查询的 废话不多说上代码

LambdaQueryWrapper<PotentialCommodityAnalysisRanking> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.between(PotentialCommodityAnalysisRanking::getCreateTime,
                LocalDateUtil.getDateTimeByString(param.getStartTime()),
                LocalDateUtil.getDateTimeByString(param.getEndTime())
        );
        queryWrapper.ge(StringUtils.isNotEmpty(param.getStartTime()),PotentialCommodityAnalysisRanking::getRefundTime,LocalDateUtil.getDateTimeByString(param.getStartTime())).
                le(StringUtils.isNotEmpty(param.getEndTime()),PotentialCommodityAnalysisRanking::getRefundTime,LocalDateUtil.getDateTimeByString(param.getEndTime()));
List < PotentialCommodityAnalysisRanking > qurryList = iPotentialCommodityAnalysisRankingService.list(queryWrapper);
 

我开发用到的查询条件主要有两个 1是between   and 卡下单时间  2是通过大于等于 小于等于 卡退货时间

使用LamdaQueryWrapper格式:

新建一个queryWapper类 

LambdaQueryWrapper<PotentialCommodityAnalysisRanking> queryWrapper = new LambdaQueryWrapper<>();

然后加条件between  and(我上面的带着LocalDateUtil.getDateTimeByString的代码是因为实际前端传给我的是时间戳 我需要转换成时间 才能用between比较)

queryWrapper.between(sql查询的实体类::get查询实体类的字段,
        传入参数1开始时间,
        传入参数2结束时间)
);

加条件大于等于和小于等于(ge大于等于 le小于等于)

queryWrapper.ge(StringUtils.isNotEmpty(参数开始时间),sql嘻查询实体类名字::get该类的比较字段,开始时间).
le(StringUtils.isNotEmpty(参数开始时间),sql嘻查询实体类名字::get该类的比较字段,开始时间);
        

最后调用service进行查询

List < PotentialCommodityAnalysisRanking > qurryList = iPotentialCommodityAnalysisRankingService.list(queryWrapper);

基本我第一期的开发就用到这么多lamda表达式的东西 后期可能我会用到更多 到时候一一更新呢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值