JDK8系列之使用Function函数式接口实现回调

1. 知识回顾

写文章之前,还是先补充一下函数式接口的知识。什么是函数式接口(Functional Interfaces)?函数式接口是jdk8的新特性之一,函数式接口是只包含一个抽象方法声明的接口。按分类主要分为四大接口类型: FunctionConsumerPredicateSupplier

接口参数返回值说明
Supplier<T>T供给型,无参,返回一个指定泛型的对象
Consumer<T>T消费型,传入一个指定泛型的参数,无返回值
Predicate<T>TBoolean断言型,判断函数,返回true或者false
Function<T,R>TR方法型,输入一个参数,返回一个结果

拓展如下,也可以直接去java.util.function包里面看,jdk提供了很多函数式接口

序号函数式接口描述说明
1BiConsumer<T,U>代表了一个接受两个输入参数的操作,并且不返回任何结果
2BiFunction<T,U,R>代表了一个接受两个输入参数的方法,并且返回一个结果
3BinaryOperator<T>代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果
4BiPredicate<T,U>代表了一个两个参数的boolean值方法
5BooleanSupplier代表了boolean值结果的提供方
6Consumer<T>代表了接受一个输入参数并且无返回的操作
7DoubleBinaryOperator代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。
8DoubleConsumer代表一个接受double值参数的操作,并且不返回结果。
9DoubleFunction<R>代表接受一个double值参数的方法,并且返回结果
10DoublePredicate代表一个拥有double值参数的boolean值方法
11DoubleSupplier代表一个double值结构的提供方
12DoubleToIntFunction接受一个double类型输入,返回一个int类型结果。
13DoubleToLongFunction接受一个double类型输入,返回一个long类型结果
14DoubleUnaryOperator接受一个参数同为类型double,返回值类型也为double 。
15Function<T,R>接受一个输入参数,返回一个结果。
16IntBinaryOperator接受两个参数同为类型int,返回值类型也为int 。
17IntConsumer接受一个int类型的输入参数,无返回值 。
18IntFunction<R>接受一个int类型输入参数,返回一个结果 。
19IntPredicate:接受一个int输入参数,返回一个布尔值的结果。
20IntSupplier无参数,返回一个int类型结果。
21IntToDoubleFunction接受一个int类型输入,返回一个double类型结果 。
22IntToLongFunction接受一个int类型输入,返回一个long类型结果。
23IntUnaryOperator接受一个参数同为类型int,返回值类型也为int 。
24LongBinaryOperator接受两个参数同为类型long,返回值类型也为long。
25LongConsumer接受一个long类型的输入参数,无返回值。
26LongFunction<R>接受一个long类型输入参数,返回一个结果。
27LongPredicateR接受一个long输入参数,返回一个布尔值类型结果。
28LongSupplier无参数,返回一个结果long类型的值。
29LongToDoubleFunction接受一个long类型输入,返回一个double类型结果。
30LongToIntFunction接受一个long类型输入,返回一个int类型结果。
31LongUnaryOperator接受一个参数同为类型long,返回值类型也为long。
32ObjDoubleConsumer<T>接受一个object类型和一个double类型的输入参数,无返回值。
33ObjIntConsumer<T>接受一个object类型和一个int类型的输入参数,无返回值。
34ObjLongConsumer<T>接受一个object类型和一个long类型的输入参数,无返回值。
35Predicate<T>接受一个输入参数,返回一个布尔值结果。
36Supplier<T>无参数,返回一个结果
37ToDoubleBiFunction<T,U>接受两个输入参数,返回一个double类型结果
38ToDoubleFunction<T>接受一个输入参数,返回一个double类型结果
39ToIntBiFunction<T,U>接受两个输入参数,返回一个int类型结果
40ToIntFunction<T>接受一个输入参数,返回一个int类型结果。
41ToLongBiFunction<T,U>接受两个输入参数,返回一个long类型结果。
42ToLongFunction<T>接受一个输入参数,返回一个long类型结果
43UnaryOperator<T>接受一个参数为类型T,返回值类型也为T。

2. 问题描述

最近项目进行重构之后,工程安装api、service、web等进行模块划分,但是缓存用户信息的是写在一个工具类里,使用ThreadLocal进行缓存,在一个service工程里需要用到工具类,直接将工具类搬过去,显然不合适,而且如果业务分为一个独立服务之后,ThreadLocal的数据是不能被其他线程访问的,所以不合适,那么要怎么处理?

3. 解决方案

想到使用jdk8的函数式接口进行回调,在Service类的方法传一个Fucntion函数,在Controller层进行实现,Service的业务执行完成之后,在通过Function函数回调获取用户信息

public class SampleController {
	@Autowired
    DoService service;
    
    public void api() {
    	// controller类实现Function函数方法
        Function fun = userCode->UserUtils.getUser(userCode);
        service.invoke(Long id , fun);
    }
}
public class DoService{
    public void invoke(Long id , Function<String,User> fun) {
        // do something
        String applyUserCode = "admin";
        // 业务处理好之后,进行回调获取用户信息
        User applyMan = fun.apply(applyUserCode);
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smileNicky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值