平时已经习惯了Consumer、Function的一些用法,经常下意识的输入一些(a)->sout(a) 之类的操作,今天在给朋友家一个孩子介绍 java 的一些语法时候,孩子问我为啥输入一个 a,这个 a 的值从哪来的。

一时居然脑袋没转过来,正好找了最近一个项目中有优化一部分重复代码,用到了自定义FunctionalInterface的写法,拿出来和小孩子做了一次分享。

原代码

代码优化前通过定义了一个接口+三个实现类通过了一个工厂模式来简单的处理不同场景下的类似操作

  1. 用户发起赠送
  2. 判断赠送的物品类型(X、Y、Z)
  3. 进入工厂根据物品类型获取赠送逻辑的实现类
  4. 调用赠送方法完成赠送

其中赠送逻辑实现类中执行赠送时候需要在执行真正赠送时候提前做一些参数转换,执行完赠送逻辑后要记录赠送结果日志

原代码截图

优化后

优化后 优化后

代码解释

1
return execute((fromUserId, componentId, toUserId) -> userGameComponentRelaLogic.transfer(fromUserId, componentId, toUserId), source);

这一部分代码execute((fromUserId, componentId, toUserId)的参数值是在Boolean result = f.exec(userId, rela.getProductId(), toUserId); // 把参数传给 函数方法的入参这一行代码传入的