关键词:
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函数式接口实现回调(代码片段)
...先补充一下函数式接口的知识。什么是函数式接口(FunctionalInterfaces)?函数式接口是jdk8的新特性之一,函数式接口是只包含一个抽象方法声明的接口。按分类主要分为四大接口类型:Function、Consumer、Predicate、Suppl... 查看详情
jdk8新特性之函数式接口(代码片段)
...1.函数式接口的由来2.函数式接口介绍2.1Supplier2.2Consumer2.3Function2.4Predicate函数式接口1.函数式接口的由来我们知道使用Lambda表达式的前提是需要有函数式接口,而Lambda表达式使用时不关心接口名,抽象方法名。只关心抽象... 查看详情
第二章jdk8新特性2之四大函数接口(代码片段)
...代替自定义接口,就不用自定义接口了。2.1jkd8函数接口FunctionFunction的使用很简单,只要把上篇的自定义接口改成Function,初体验:1publicclassLambdaTester2publicstaticvoidmain(String[]args)3System.out.println("mainfunction...");4testFunction();567//以函数... 查看详情
jdk8新特性之4大函数式接口
函数式接口介绍它们主要在java.util.function包中。下面是最常用的几个接口。1.Supplier接口@FunctionalInterfacepublicinterfaceSupplier<T>{/***Getsaresult.**@returnaresult*/Tget();}2.Consumer接口@FunctionalInterfacepublicinterfaceC 查看详情
jdk8系列之default定义接口的默认实现方法(代码片段)
JDK8系列之default定义接口的默认实现方法在前面的章节的学习中,我们学习了jdk8的新特性,lambada表达式、方法引用、函数式接口等等,接着本博客继续学习jdk8的新特性default方法1、什么是默认方法?默认方法... 查看详情
jdk8中的函数式接口了解下
...8195;在JDK中帮我们提供的有函数式接口,主要是在java.util.function包中。 无参有返回值的接口,对于的Lambda表达式需要提供一个返回数据的类型。使用: 有参无返回值得接口,前面介绍的Supplier接口是用来生产数... 查看详情
java系列教程一起爪哇java8——函数式接口
...来提高编程效率。因为Java8引入了函数式接口,在java.util.function包含了几大类函数式接口声明。这里第一篇主要研究一下Function相关的接口。FunctionalInterface注解Java8的新引入,包含函数式的设计,接口都有@Functiona 查看详情
jdk8系列之functionalinterfaces教程和示例(代码片段)
JDK8系列之FunctionalInterfaces教程和示例在前面章节的学习中,我们学习了JDK8的lambada表达式和方法引用,接着,本章节继续学习jdk8的一个重要特性FunctionalInterfaces,翻译过来就是函数式接口1、什么是FunctionalInterfaces... 查看详情
jdk8新特性(代码片段)
...编程常用函数式接口Stream流方法引用学习目标能够使用@FunctionalInterface注解能够自定义无参无返回函数式接口能够自定义有参有返回函数式接口能够理解Lambda延迟执行的特点能够使用Lambda作为方法的参数能够使用Lambda作为方法的... 查看详情
《jdk8新特性专题》-03函数式接口(代码片段)
...函数式接口的由来2.函数式接口介绍2.1.Supplier2.2.Consumer2.3.Function2.4.Predicate1.函数式接口的由来我们知道使用Lambda表达式的前提是需要有函数式接口,而Lambda表达式使用时不关心接口名,抽象方法名。只关心抽象方法的参数... 查看详情
004.函数式接口
1.JDK8常用函数式接口 2.示例代码packagecom.imooc.lambda;importjava.util.function.Consumer;/***ConsumerSample接口的使用*/publicclassConsumerSamplepublicstaticvoidmain(String[]args)output(s->System.out.pri 查看详情
jdk8系列之streamapi入门教程和示例(代码片段)
JDK8系列之StreamAPI入门教程和示例在前面的章节的学习中,我们学习了jdk8的新特性,lambada表达式、方法引用、函数式接口等等,接着本博客继续JDK8的一个比较重要的特性,JDK8StreamAPI1、什么是Jdk8Stream?Streamapi... 查看详情
javajdk8新特性:函数式接口@functionalinterface的使用说明jdk8新特性:函数式接口@functionalinterface的使用说明
一、参考资料JDK8新特性:函数式接口@FunctionalInterface的使用说明函数式接口@FunctionalInterface 查看详情
java之lambda表达式与函数式接口(代码片段)
...,最后介绍了常用的函数式接口Supplier,Consumer,Predicate,Function等,并对函数式接口的使用进行了练习。目录1、多线程实现方式体验lambda表达式2、lambda表达式练习(抽象方法无参无返回值)3、lambda表达式练习(抽象方法带参无... 查看详情
jdk8函数接口
...出的Lambda表达式,即函数式编程,相信很多开发胸弟都会使用了,但是什么是函数式编程呢?别问我,我也不知道标准的定义。其核心思想是:使用不可变值和函数,函数对一个值进行处理,映射成另一个值。函数接口java8之前... 查看详情
jdk8中重要的函数式接口(必知必会)
...:不接收参数,返回一个对象。定义:Tget()默认方法:无Function<T,R>(单参函数)功能:接收一个参数,返回一个参数。可理解为初阶函数f(x)定义:Ra 查看详情
jdk8系列之optionalapi应该怎样用?(代码片段)
JDK8系列之OptionalAPI应该怎样用?1、Optional的简单介绍在前面的章节的学习中,我们学习了jdk8的新特性,lambada表达式、方法引用、函数式接口等等,接着本博客继续JDK8的一个比较重要的特性,JDK8中Optional,... 查看详情
keras之函数式(functional)模型
函数式(Functional)模型我们起初将Functional一词译作泛型,想要表达该类模型能够表达任意张量映射的含义,但表达的不是很精确,在Keras2里我们将这个词改移为“函数式”,函数式模型称作Functional,但它的类名是Model,因此有时... 查看详情