接口 | 参数 | 返回值 | 说明 |
---|---|---|---|
Supplier | 无 | T | 供给型,无参,返回一个指定泛型的对象 |
Consumer | T | 无 | 消费型,传入一个指定泛型的参数,无返回值 |
Predicate | T | Boolean | 断言型,判断函数,返回true或者false |
Function | T | R | 方法型,输入一个参数,返回一个结果 |
也可以直接去java.util.function包里面看,jdk提供了很多函数式接口。比如
序号 | 函数式接口 | 描述说明 |
---|---|---|
1 | BiConsumer | 代表了一个接受两个输入参数的操作,并且不返回任何结果 |
2 | BiFunction | 代表了一个接受两个输入参数的方法,并且返回一个结果 |
员工执行业务逻辑完成任务后,老板收到回调通知。
/*** 员工类** @author zsh*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {/*** 员工的名字*/private String name;/*** 员工处理任务的逻辑*/private Function taskFunction;/*** 处理任务的方法** @param boss 发布任务的老板对象,包含老板名称,任务及回调*/protected void doTask(Boss boss) {if (null == boss || null == boss.getTask()) {throw new IllegalArgumentException("boss is not ready...");}if (null == this.taskFunction) {throw new IllegalArgumentException("employee has no skills for task...");}//执行任务的实际方法C callback = taskFunction.apply(boss.getTask());//将结果发送给老板boss.callback(this, callback);}
}
/*** 老板类** @author zsh*/@Data
@AllArgsConstructor
@NoArgsConstructor
public class Boss {/*** 老板的名字*/private String name;/*** 老板待发布的任务*/private T task;/*** 老板处理回调的方法*/private BiConsumer, C> callbackConsumer;/*** 指定员工去完成老板的任务* 员工完成任务后回调老板的接口** @param employee 指定的员工*/public void assignTask(Employee employee) {employee.doTask(this);}/*** 完成任务后的回调** @param employee* @param callback*/protected void callback(Employee employee, C callback) {if (null != callback && null != callbackConsumer) {callbackConsumer.accept(employee, callback);}}
}
/*** 回调service** @author zsh*/
@Service
public class CallBackService {/*** 回调方法*/public void bossAssignTask() {//初始化老板对象,指定名称,任务和处理回调的逻辑Boss bossA = new Boss<>("bossA",(T) "a任务",(e, c) -> System.out.println("BossA收到" + e.getName() + "的回调啦..." + c.toString()));//初始化员工对象,指定名称和处理任务的逻辑Employee employee = new Employee<>("employee",t -> {System.out.println("【员工A】收到任务" + t.toString() + "啦...");try {//通过睡眠,模拟执行任务Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("【员工A】完成任务" + t.toString() + "啦...");return (C) "确认了处理结果";});//老板给员工安排任务,员工完成任务后老板会收到回调bossA.assignTask(employee);//员工可以换一个处理这个任务的逻辑employee.setTaskFunction(t -> {System.out.println("【员工A新逻辑】收到任务" + t.toString() + "啦...");try {//通过睡眠,模拟执行任务Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("【员工A新逻辑】完成任务" + t.toString() + "啦...");return (C) "确认了新逻辑处理结果";});//老板继续给员工安排任务bossA.assignTask(employee);//老板有了新任务bossA.setTask((T) "b任务");//老板继续给员工安排任务bossA.assignTask(employee);//老板有新的回调逻辑bossA.setCallbackConsumer((e, c) -> System.out.println("BossA新的回调方法收到" + e.getName() + "的回调啦..." + c.toString()));//老板继续给员工安排任务//bossA.assignTask(employee);}
}
/*** 回调Controller** @author zsh*/
@RestController
@RequestMapping("/callBackController")
public class CallBackController {@Autowiredprivate CallBackService callBackService;@RequestMapping("/callBackBossAssignTask")public boolean callBackBossAssignTask() {callBackService.bossAssignTask();return true;}}
项目源码下载 spring-boot2.-xlearn 欢迎Star
参考资料
JDK8系列之使用Function函数式接口实现回调
java8 函数式接口 实现回调