JDK8系列之使用Function函数式接口实现回调
        【摘要】 
                    
                        
                    
                    1. 知识回顾 
写文章之前,还是先补充一下函数式接口的知识。什么是函数式接口(Functional Interfaces)?函数式接口是jdk8的新特性之一,函数式接口是只包含一个抽象方法声明的接口。按...
    
    
    
    1. 知识回顾
写文章之前,还是先补充一下函数式接口的知识。什么是函数式接口(Functional Interfaces)?函数式接口是jdk8的新特性之一,函数式接口是只包含一个抽象方法声明的接口。按分类主要分为四大接口类型: Function、Consumer、Predicate、Supplier
| 接口 | 参数 | 返回值 | 说明 | 
|---|---|---|---|
| Supplier<T> | 无 | T | 供给型,无参,返回一个指定泛型的对象 | 
| Consumer<T> | T | 无 | 消费型,传入一个指定泛型的参数,无返回值 | 
| Predicate<T> | T | Boolean | 断言型,判断函数,返回true或者false | 
| Function<T,R> | T | R | 方法型,输入一个参数,返回一个结果 | 
拓展如下,也可以直接去java.util.function包里面看,jdk提供了很多函数式接口
| 序号 | 函数式接口 | 描述说明 | 
|---|---|---|
| 1 | BiConsumer<T,U> | 代表了一个接受两个输入参数的操作,并且不返回任何结果 | 
| 2 | BiFunction<T,U,R> | 代表了一个接受两个输入参数的方法,并且返回一个结果 | 
| 3 | BinaryOperator<T> | 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果 | 
| 4 | BiPredicate<T,U> | 代表了一个两个参数的boolean值方法 | 
| 5 | BooleanSupplier | 代表了boolean值结果的提供方 | 
| 6 | Consumer<T> | 代表了接受一个输入参数并且无返回的操作 | 
| 7 | DoubleBinaryOperator | 代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。 | 
| 8 | DoubleConsumer | 代表一个接受double值参数的操作,并且不返回结果。 | 
| 9 | DoubleFunction<R> | 代表接受一个double值参数的方法,并且返回结果 | 
| 10 | DoublePredicate | 代表一个拥有double值参数的boolean值方法 | 
| 11 | DoubleSupplier | 代表一个double值结构的提供方 | 
| 12 | DoubleToIntFunction | 接受一个double类型输入,返回一个int类型结果。 | 
| 13 | DoubleToLongFunction | 接受一个double类型输入,返回一个long类型结果 | 
| 14 | DoubleUnaryOperator | 接受一个参数同为类型double,返回值类型也为double 。 | 
| 15 | Function<T,R> | 接受一个输入参数,返回一个结果。 | 
| 16 | IntBinaryOperator | 接受两个参数同为类型int,返回值类型也为int 。 | 
| 17 | IntConsumer | 接受一个int类型的输入参数,无返回值 。 | 
| 18 | IntFunction<R> | 接受一个int类型输入参数,返回一个结果 。 | 
| 19 | IntPredicate | :接受一个int输入参数,返回一个布尔值的结果。 | 
| 20 | IntSupplier | 无参数,返回一个int类型结果。 | 
| 21 | IntToDoubleFunction | 接受一个int类型输入,返回一个double类型结果 。 | 
| 22 | IntToLongFunction | 接受一个int类型输入,返回一个long类型结果。 | 
| 23 | IntUnaryOperator | 接受一个参数同为类型int,返回值类型也为int 。 | 
| 24 | LongBinaryOperator | 接受两个参数同为类型long,返回值类型也为long。 | 
| 25 | LongConsumer | 接受一个long类型的输入参数,无返回值。 | 
| 26 | LongFunction<R> | 接受一个long类型输入参数,返回一个结果。 | 
| 27 | LongPredicate | R接受一个long输入参数,返回一个布尔值类型结果。 | 
| 28 | LongSupplier | 无参数,返回一个结果long类型的值。 | 
| 29 | LongToDoubleFunction | 接受一个long类型输入,返回一个double类型结果。 | 
| 30 | LongToIntFunction | 接受一个long类型输入,返回一个int类型结果。 | 
| 31 | LongUnaryOperator | 接受一个参数同为类型long,返回值类型也为long。 | 
| 32 | ObjDoubleConsumer<T> | 接受一个object类型和一个double类型的输入参数,无返回值。 | 
| 33 | ObjIntConsumer<T> | 接受一个object类型和一个int类型的输入参数,无返回值。 | 
| 34 | ObjLongConsumer<T> | 接受一个object类型和一个long类型的输入参数,无返回值。 | 
| 35 | Predicate<T> | 接受一个输入参数,返回一个布尔值结果。 | 
| 36 | Supplier<T> | 无参数,返回一个结果 | 
| 37 | ToDoubleBiFunction<T,U> | 接受两个输入参数,返回一个double类型结果 | 
| 38 | ToDoubleFunction<T> | 接受一个输入参数,返回一个double类型结果 | 
| 39 | ToIntBiFunction<T,U> | 接受两个输入参数,返回一个int类型结果 | 
| 40 | ToIntFunction<T> | 接受一个输入参数,返回一个int类型结果。 | 
| 41 | ToLongBiFunction<T,U> | 接受两个输入参数,返回一个long类型结果。 | 
| 42 | ToLongFunction<T> | 接受一个输入参数,返回一个long类型结果 | 
| 43 | UnaryOperator<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);
    }
}
  
 - 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
public class DoService{
    public void invoke(Long id , Function<String,User> fun) {
        // do something
        String applyUserCode = "admin";
        // 业务处理好之后,进行回调获取用户信息
        User applyMan = fun.apply(applyUserCode);
    }
}
  
 - 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
文章来源: smilenicky.blog.csdn.net,作者:smileNicky,版权归原作者所有,如需转载,请联系作者。
原文链接:smilenicky.blog.csdn.net/article/details/126216231
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
- 收藏
- 关注作者
 
             
           
评论(0)