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

Posted SmileNicky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK8系列之使用Function函数式接口实现回调相关的知识,希望对你有一定的参考价值。


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);

public class DoService
public void invoke(Long id , Function<String,User> fun)
// do something
String applyUserCode = "admin";
// 业务处理好之后,进行回调获取用户信息
User applyMan = fun.apply(applyUserCode);


以上是关于JDK8系列之使用Function函数式接口实现回调的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Java新特性解读JDK8之函数式接口Function

JDK8新特性之函数式接口

JDK8系列之default定义接口的默认实现方法

Jdk8新特性之4大函数式接口