在以下示例代码中,我无法理解为case II
投诉case I
而不是java.awt.Color::brighter
投诉的原因。虽然NewBrightColor::brightColor
和public static void main(String[] args) {
// CASE I
Function<Color, Color> brighter = Color::brighter;
// CASE II
Function<Color, Color> newBrighter = NewBrightColor::brightColor;
}
class NewBrightColor {
public Color brightColor() {
// return some Bright color
}
}
具有相似的方法签名。
Function<R,T>
编辑:
我从演示文稿https://youtu.be/e4MT_OguDKg?t=31m58s
中采用了这个例子根据我的理解,R
应仅采用输入为T
且输出为case I
的函数。但是在Function<Color, Color>
中它不是真的(brighter()
期望Color作为输入但是case II
输入void),但仍然没有编译错误但是在{{1}}它会抛出编译问题
答案 0 :(得分:3)
查看Color.brighter
public Color brighter();
现在看看你的方法参考:
Function<Color, Color> brighter = Color::brighter;
因此,当我致电brighter.apply(color)
时,我会致电color.brighter
并返回结果。
现在看一下NewBrightColor.brightColor
的方法签名:
public Color brightColor(Color color)
查看函数参考
Function<Color, Color> newBrighter = NewBrightColor::brightColor;
当我致电newBrighter.apply(colour)
时,我需要在brightColor
的实例上调用NewBrighter
并返回结果。
所以我有一个缺少的论点 - 我需要一个Color
来提高*和**我需要NewBrightColor
我要打{{1}} ,传递颜色。
所以,你可以
1)使用brightColor
:
BiFunction
这将在致电BiFunction<NewBrightColor, Color, Color> newBrighter = NewBrightColor::brightColor
时致电newBrighter.apply(brighter, color)
。
2)在brighter.brightColor(color)
的实例上定义Function
:
NewBrighter
这将在致电NewBrighter nb = //somehow get an instance
Function<Color, Color> newBrighter = nb::brightColor;
时致电newBrighter.apply(color)
。
答案 1 :(得分:2)
justify-content-center
是非参数方法,而Color#brighter()
需要Function<Color,Color>
参数 - Color
修改强>
以下示例显示了实例与静态 方法参考
之间的区别apply(Color)
那么为什么将实例no-arg 方法public static void main(String[] args) {
MyColor c = new MyColor();
Function<Color, Color> brighterInstance = c::brighterInstanceMethod; // OK
Function<Color, Color> brighterStatic = MyColor::brighterStaticMethod; // OK
// CASE II - trying to assign instance method via static context
Function<Color, Color> brighter = MyColor::brighterInstanceMethod; // compilation error
}
static class MyColor {
public Color brighterInstanceMethod(Color color) {return null;}
public static Color brighterStaticMethod(Color color) {return null;}
}
分配给Color#brighter()
是合法的?
Function<Color,Color>
由于没有错误,它必须以某种方式在传入给定函数i的对象上调用引用的方法public static void main(String[] args) {
// CASE I
Function<Color, Color> brighter = Color::brighter; // surprisingly no error
System.out.println(brighter.apply(Color.GREEN));
}
。即Color#brighter()
。
修改强>
实例 Method References 两种类型(不知道):
第一个表现得像预期的那样。以下是第二个的描述:
对于任意对象的实例方法的引用,类型 方法所属的分隔符和分隔符 调用的接收器是功能的第一个参数 界面方法:
Color.GREEN
这里,隐式lambda表达式有一个参数,即字符串to 转换为大写,成为接收者 调用toUpperCase()方法。
有关详细信息,请参阅State of the lambda - 8. Method references, Method References
<强> Sumarization 强>
此类型的方法引用被翻译为“在函数的参数上调用引用的方法”。
修改强>
Method reference to Function translation
Function<String, String> upperfier = String::toUpperCase;
指向类似帖子的链接: