Java 回调与lt;P、 R>;和功能<;T、 R>;

Java 回调与lt;P、 R>;和功能<;T、 R>;,java,javafx,lambda,Java,Javafx,Lambda,看起来很相似。我能找到的唯一实质性区别是,函数有一些用于组合函数的实用方法,而回调函数没有 在我自己的代码中,我发现自己有时使用其中一个,有时使用另一个,而没有真正考虑它。果不其然,他们两人都乐于接受同样形式的lambda 由于Callback是一个JavaFX类,我假设它排在第二位,所以我的问题是-为什么创建它?是否有任何理由使用一个而不是另一个?一个能安全地被铸造成另一个吗 回调早于函数。(因为JavaFX2.0)JavaFX需要这个功能,Java没有,所以JavaFX定义了它。然后Java

看起来很相似。我能找到的唯一实质性区别是,函数有一些用于组合函数的实用方法,而回调函数没有

在我自己的代码中,我发现自己有时使用其中一个,有时使用另一个,而没有真正考虑它。果不其然,他们两人都乐于接受同样形式的lambda


由于
Callback
是一个JavaFX类,我假设它排在第二位,所以我的问题是-为什么创建它?是否有任何理由使用一个而不是另一个?一个能安全地被铸造成另一个吗

回调早于函数。(因为JavaFX2.0)JavaFX需要这个功能,Java没有,所以JavaFX定义了它。然后Java8在更一般的上下文中介绍了它

不能将一个强制转换为另一个,因为这两个都不是另一个的子类型。但是,您可以通过lambdas将一个签名分配给另一个,因为签名是相同的

换言之:

Callback<String, Integer> lengthCB = s -> s.length(); // or String::length
Function<String, Integer> lengthFunc = (Function<String, Integer>) lengthCB ;
回调长度cb=s->s.length();//或字符串::长度
函数lengthFunc=(函数)lengthCB;
给出类强制转换异常,但

Callback<String, Integer> lengthCB = s -> s.length(); // or String::length
Function<String, Integer> lengthFunc = lengthCB::call ;
回调长度cb=s->s.length();//或字符串::长度
函数lengthFunc=lengthCB::call;
很好

至于使用哪种类型,如果您使用lambdas(或方法引用)实现它们,这个问题通常是没有意义的,因为编译器只会从上下文推断类型

如果您实际上是将它们分配给变量,或者使用类定义(而不是lambda)实现接口,那么您必须选择一种类型。您应该根据所需的用途和上下文进行操作:如果要将其传递给需要回调的JavaFX对象,请使用回调,否则请使用函数

如果要将它们定义为类中的字段,通常应首选
函数
,因为它适用于更广泛的上下文。同样,如果它直接用于JavaFX控件,那么使用
回调
可能更有意义

两个接口都是“功能性”接口或单一抽象方法接口。lambda以这种方式实现的原因之一是,单一抽象方法接口是Java中的一种既定模式,回调就是一个例子

使用一个来自
javafx
的类可能会被认为是一种味道,在这里您有
java.util.function.function
,它在UI代码之外附带了一些其他有用的默认方法