Callback和Function似乎非常相似。我能找到的唯一重要区别是Function有一些实用的方法来组合函数,而Callback则没有。
在我自己的代码中,我发现自己有时使用一个,有时使用另一个,而没有真正考虑它。果然,他们都乐于接受同样形式的lambdas。
由于Callback
是一个JavaFX类,我认为它排在第二位,所以我的问题是 - 它为什么被创建?是否有任何具体理由使用其中一个?可以安全地投射另一个吗?
答案 0 :(得分:5)
Callback早于Function。 (“自JavaFX 2.0以来”。)JavaFX需要该功能,Java没有它,因此JavaFX定义了它。然后Java 8在更一般的背景下引入它。
你不能把一个投射到另一个,因为它们都不是另一个的子类型。但是,您可以通过lambdas将其分配给另一个,因为签名是相同的。
换句话说:
Callback<String, Integer> lengthCB = s -> s.length(); // or String::length
Function<String, Integer> lengthFunc = (Function<String, Integer>) lengthCB ;
给出了一个类强制转换异常,但是
Callback<String, Integer> lengthCB = s -> s.length(); // or String::length
Function<String, Integer> lengthFunc = lengthCB::call ;
很好。
至于使用哪个,如果你用lambdas(或方法引用)实现它们,问题通常没有实际意义,因为编译器只会从上下文中推断出类型。
如果您实际将它们分配给变量,或者使用类定义(而不是lambda)实现接口,那么您将被迫选择一种类型。您应该根据所需的用法和上下文执行此操作:如果要将其传递给需要回调的JavaFX对象,请使用回调,否则使用函数。
如果您将它们定义为类中的字段,则通常应该更喜欢Function
,因为它适用于更广泛的上下文。再次,如果它直接用于JavaFX控件,使用Callback
可能更有意义。
答案 1 :(得分:1)
两个接口都是“功能”或单个抽象方法接口。 Lambda以其实现方式实现的原因之一是因为单个抽象方法接口是Java中已建立的模式,而Callback是一个示例。
使用来自javafx
的类可能会被认为是一种气味,其中java.util.function.Function
带有一些除UI代码之外的其他有用的默认方法。