Java小巧工具类

主要记录自己积累的工具类

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颗星

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值