gpt4 book ai didi

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

转载 作者:知者 更新时间:2024-03-12 08:18:30 25 4
gpt4 key购买 nike

1. 知识回顾

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

接口 参数 返回值 说明
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);
    }
}

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com