主要记录自己积累的工具类
1.实体转换处理
在开发中经常会遇到从数据库中查询一个实体列表,但是只需要实体中的某个字段,所以需要利用Java 的Stream处理,获得这个字段的列表
List<RoleMenu> ownedMenus = roleMenuMapper.selectByMap(Map.of("roleId", roleId));
if(!CollectionUtils.isEmpty(ownedMenus)){
return null;
}else{
return ownedMenus.stream().map(e -> e.getMenuId()).collect(Collectors.toList());
}
久而久之则想抽取成一个工具类,参考Mybatis Plus中常用的查询Lambda写法,这里可以将想要获取的字段用函数式接口的
Function<T, U> function替换
public static <T, U> List<U> apply(List<T> list, Function<T, U> apply) {
if (CollectionUtils.isNotEmpty(list)) {
return list.stream().map(e -> apply.apply(e)).collect(Collectors.toList());
}else {
return new ArrayList<>();
}
}
上面的传统代码则被简化成两行甚至一行,如果想要别的字段只需要修改方法引用即可
List<RoleMenu> ownedMenus = roleMenuMapper.selectByMap(Map.of("roleId", roleId));
return StreamUtil.apply(ownedMenus, RoleMenu::getMenuId);
优雅指数:4颗星
实用指数:4颗星
2.NPE问题
代码中经常需要判空处理,比如调用方法得到的对象,数据库查询获取的列表等,都需要判空处理,判空一般使用工具类或者Optional接口。这里仍然尝试使用函数式接口解决
比如下面有一段代码从数据库查询一个列表,并对列表中的每一个元素进行处理
List<TableWrapper> tableWrappers = databaseObjectDAO.selectTables(schema, table);
if(!CollectionUtils.isEmpty(tableWrappers)){
tableWrappers.forEach(e->{
List<ColumnWrapper> columns = databaseObjectDAO.selectColumns(schema, e.getTableName());
handleTableWrapper(e, columns);
});
}
return tableWrappers;
工具类
public static<T> void consumeElement(List<T> list, Consumer<T> consumer){
if (CollectionUtils.isNotEmpty(list)){
list.stream().forEach(consumer);
}
}
改造后:
List<TableWrapper> tableWrappers = databaseObjectDAO.selectTables(schema, table);
NPEUtil.consumeElement(tableWrappers, e->{
List<ColumnWrapper> columns = databaseObjectDAO.selectColumns(schema, e.getTableName());
handleTableWrapper(e, columns);
});
return tableWrappers;
如果需要对某个对象处理并获取新的值
public static<T,U> U apply(T t, Function<T,U> function) {
if(Objects.nonNull(t)){
return (U) function.apply(t);
}
return null;
}
代码调用
TableWrapper tableWrapper = loadTableWrapper(ObjectUtil.ifFull(dto.getSchema(), reverseProject.getSchema().getSchemaName()), dto.getTable());
String product = NPEUtil.apply(tableWrapper, e -> {
//核心代码 省略...
return product;
根据判空的对象和自己的需求结合函数式接口构造出自己需要的工具类。
不过这个工具类对一些复杂度较低的代码有效,如果代码复杂度较高,含有很多可能的空指针仍然会带来嵌套地狱问题,增加代码的复杂度。
优雅指数:3颗星
实用指数:3颗星