Java函数式编程实践一---记录使用函数作为参数

背景

Java8 引入了函数式编程,但是本人在日常的开发中使用较少,这里简要记录其中一些使用示例

具体示例

先看具体的示例代码, 整个工程有多处需要先判断XStatus后再具体处理的地方,但是判断XStatus后需要进行一些处理,也就如果不存在就返回错误,version大于当前最新版本也返回错误。 如将这段检查xStatus并判断代码copy多次代码冗余,并且后期如果修改预检测逻辑也需要修改多次, 但是这段检查xStatus代码有封装单独方法后,也必须判断返回值,所以不如将跟branch、id 、version查询的部分封装,这样更简洁。

  private <T> Response<T> baseGetByIdVersion(String branch, String id, int version,
                                                FN3<Response<T>, String, String, Integer> getFunc)
  {
    Response<XStatus> xResp = commonService.getXXX(id, branch);
    if (!xResp.isPresent()) {
      return failure(GENERAL_FAILURE, "Id %s does not exist in branch '%s'".formatted(id, branch));
    }
    XStatus xStatus = xResp.get();
    final int latestVer = xStatus.getLatestVer();
    if (version > latestVer) {
      return failure(GENERAL_FAILURE, "The latest version of Id %s in branch '%s' is %d, can't find ver:%d".formatted(id, branch, latestVer, version));
    }

    return getFunc.apply(branch, id, version);
  }

其中FN3<Response, String, String, Integer> getFunc的定义如下

   @FunctionalInterface
   interface FN3<R, T1, T2, T3> {
       R apply(T1 param1, T2 param2, T3 param3);
   }

其他具体类的使用如下, 例如classA使用

  @Override
  public Response<ClassA> classAVersion(String branch, String id, int version)
  {
    return baseGetByIdVersion(branch, id, version, this::classAVersionWithoutParameterValidated);
  }

  private Response<ClassA> classAVersionWithoutParameterValidated(String branch, String id, int version)
  {
    List<ClassA> logList = verQuery.getXXX(id, version, branch);
    if (logList.isEmpty()) {
      return failure(GENERAL_FAILURE, "fail to find log by branch:%s, id:%s, ver:%d".formatted(branch, id, version));
    } else {
      return success(logList.get(0), "done");
    }
  }
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值