最近公司用的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表达式的东西 后期可能我会用到更多 到时候一一更新呢