- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
写文章之前,还是先补充一下函数式接口的知识。什么是函数式接口(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。 |
最近项目进行重构之后,工程安装api、service、web等进行模块划分,但是缓存用户信息的是写在一个工具类里,使用ThreadLocal进行缓存,在一个service工程里需要用到工具类,直接将工具类搬过去,显然不合适,而且如果业务分为一个独立服务之后,ThreadLocal的数据是不能被其他线程访问的,所以不合适,那么要怎么处理?
想到使用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 和 ANT,然后将用 JDK6 编写的旧包编译到 1.6。我真的很困惑。 最佳答案 一般来说,java 向后兼容所
据我所知,在windows中使用JDK有两种方式: 下载JDK安装文件并安装。 下载 JDK 二进制文件。 它们有什么区别? 最佳答案 优点:简单易行,突然间一切正常。 缺点:现在一切都使用新版本 -
我正在安装 HANA Studio,并且已下载 JDK 1.8 和 JDK 1.7。我将 JDK 1.8 用于 Eclipse 和我正在处理的其他一些事情,但是当我尝试通过 SAP HANA 生命周期
JDK 7 的哪些特性(不包括 invokedynamic,因为它不被 java 使用)导致新的类文件版本与 JDK 6 不兼容。似乎所有特性都可以通过编译器生成胶水代码来实现。例如 switch 语
在redhat机器上安装cloudera的库来创建cloudera集群是否必须使用Oracle JDK而不是Open JDK? 最佳答案 在撰写本文时,只有 Oracle JDK 版本经过认证可与 C
下面的语句在 Java 7 中有效吗? Timestamp.valueOf("0000-00-00 00:00:00.000000"); 因为使用 JDK 1.6 构建上述代码效果很好,但在使用 JD
更新 在整个评论中,结果证明我采用的基准测试方法是不正确的,因此结果具有误导性。纠正我的方法后(如已接受的答案),结果正如人们所期望的 - JDK 13 的性能与 JDK 11 一样好。有关更多详细信
我们很快就会从 jdk14 迁移到 jdk16。我们的是桌面应用程序。我需要采取什么措施来确保它在客户端机器上正常工作?现在他们中的一些人使用 JRE4 和一些 JRE6.Server-Solaris
我在/usr/lib/jvm 中有 jdk1.7.0 目录以及其他 open-jdk 版本。我希望我的 Ubuntu 12.04 将此 jdk(jdk1.7.0) 视为其主要 jdk,即我不想使用 o
我认为这可能与 Why does a generic cast of a List to List succeed on Sun JDK 6 but fail to compile on Oracle
代码使用 JDK 8 (1.8.0_212) 编译良好,但使用 JDK 11 (11.0.3) Oracle jdk 和 open jdk (aws corretto) 编译失败 尝试使用 javac
是否可以在 cygwin 上安装任何版本的 Sun JDK 或 Open JDK。 我寻找此选项的原因是:有许多工具(例如 jStack、jMap)在 JDK 的 unix 版本中可用,但在 wind
请确认以上说法? 当他们提到 JDK 时,我需要知道他们指的是什么。 最佳答案 Java Development Kit 是我们通常指的一组创建 Java 应用程序的工具,包括 Java Compil
使用 java -version 给我这个。 java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
这个问题在这里已经有了答案: JAVA_HOME should point to a JDK not a JRE (25 个答案) 关闭 4 年前。 您好,感谢您提供的任何帮助。 我刚刚升级到 Ub
没错,自阿里、腾讯之后,华为也终于开源了自家的 JDK——毕昇 JDK! 免费!免费!免费!!! Oracle 要慌了? 毕昇 JDK 毕昇 JDK 是华为内部 OpenJDK 定制版 Hu
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭去年。 Improve this quest
将 Arquillian 添加到 Maven 构建时,我在 Eclipse 中遇到上述异常: Missing artifact sun.jdk:jconsole:jar:jdk
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我正在尝试创建一个 pom,它将: 使用 maven-toolchains-plugin 中的正确 JDK基于 java.version 属性。 根据 maven-toolchains-plugin
我是一名优秀的程序员,十分优秀!