Lambda实践总结
这都快0202年,对Lambda依然一知半解,实在惭愧。最近搬砖中着重实践了一下,总结些实践,贴出如下,留作备忘。
1、基础查询封装
这个封装,主要是用来抽象数据库查询,美化代码的(强迫症)。
函数接口
@FunctionalInterfacepublic interface Query<T> {
List<T> query() throws Exception;
}
工具类
public class QueryUtil { public static <T> T query(Query<T> query) throws Exception {
List<T> list = query.query();
if (null != list && list.size() > 0) {
return list.get(0);
}
return null;
}
public static <T> List<T> queryList(Query<T> query) throws Exception {
List<T> list = query.query();
if (null != list && list.size() > 0) {
return list;
}
return new ArrayList<T>();
}
}
2、遍历
遍历可以直接forEach也可以先stream()再forEach
#直接foreachdepartmentVos.forEach(departmentVo -> {
ids.add(departmentVo.getOaDeptId());
pids.add(departmentVo.getOaDeptParentId());
tmp.put(departmentVo.getOaDeptParentId(), departmentVo);
});
#先stream与上等效
departmentVos.stream().forEach(departmentVo -> {
ids.add(departmentVo.getOaDeptId());
pids.add(departmentVo.getOaDeptParentId());
tmp.put(departmentVo.getOaDeptParentId(), departmentVo);
});
#特殊情况可以开启多线程
departmentVos.parallelStream().forEach(departmentVo -> {
ids.add(departmentVo.getOaDeptId());
pids.add(departmentVo.getOaDeptParentId());
tmp.put(departmentVo.getOaDeptParentId(), departmentVo);
});
3、调用工具类实现数据库查询
这个属于自己定义的函数接口
#单条RSyncDeptPosiEmplVo rSyncDeptPosiEmplVo = QueryUtil.query(() -> {
RSyncDeptPosiEmplVo rSyncDeptPosiEmplQc = new RSyncDeptPosiEmplVo();
rSyncDeptPosiEmplQc.setOaUserId(currentEmpl.getOaUserId());
rSyncDeptPosiEmplQc.setIsOn((byte) 1);
rSyncDeptPosiEmplQc.setIsSeveralPositions((byte) 0);
return this.irSyncDeptPosiEmplService.queryRSyncDeptPosiEmpl(rSyncDeptPosiEmplQc);
});
#多条
List<RSyncDeptPosiEmplVo> rSyncDeptPosiEmplVos = QueryUtil.queryList(() -> {
RSyncDeptPosiEmplVo rSyncDeptPosiEmplQc = new RSyncDeptPosiEmplVo();
rSyncDeptPosiEmplQc.setOaUserId(currentEmpl.getOaUserId());
rSyncDeptPosiEmplQc.setIsOn((byte) 1);
rSyncDeptPosiEmplQc.setIsSeveralPositions((byte) 0);
return this.irSyncDeptPosiEmplService.queryRSyncDeptPosiEmpl(rSyncDeptPosiEmplQc);
});
4、ETL
姑且叫ETL吧
#原样输出(主要用于中间数据处理)deptList.stream().map((dept) -> {
return this.fillTreeData(dept, oaDeptIds);
}).collect(Collectors.toList())
#过滤(如过滤掉null数据
deptList.stream().filter((dept) -> {
return null==dept;
}).collect(Collectors.toList())
#转换
deptList.stream().map(RSyncDeptPosiEmplVo::getId).collect(Collectors.toList())
5、计算
直接上码
#加teacherVo.getTotalTeachHour()
+ rClassSubjectVos.stream().mapToInt(RClassSubjectVo::getSubHour).sum()
#平均
teacherVo.getTotalTeachHour()
+ rClassSubjectVos.stream().mapToInt(RClassSubjectVo::getSubHour).average()
#其它还有减、除、统计数量等等
6、判断
permissionVos.stream().anyMatch(p -> p.getIsApproval().equals((byte) 1)
7、搜索匹配
可以搜索符合条件的,也可以搜索符合条件的第一个
permissionVos.stream() .filter(p -> p.getDownSize() > 0 && p.getDownSize() > p.getRealDownSize()).findFirst();
暂时就这么多了,想起来再补充。
以上是 Lambda实践总结 的全部内容, 来源链接: utcz.com/z/511284.html