我正在尝试学习Lambda表达式,
interface MathOperartor
已经为int和float类型重载了operator(),我确定使用Lambda表达式应该可以做到这一点,但似乎不太可能找出问题所在:
public static void main(String[] args) {
LambdaLearning lb = new LambdaLearning();
MathOperartor add = (a , b )-> a + b; // error: The target type of this expression must be a functional interface
MathOperartor sub = (a , b) -> a - b; // same error
MathOperartor mul = (a , b) -> a * b; // ''
MathOperartor div = (a , b) -> a / b; // ''
System.out.println(lb.operate(10, 15, add));
System.out.println(lb.operate(10.5f, 15.5f, sub));
System.out.println(lb.operate(10, 15, mul));
System.out.println(lb.operate(10, 15, div));
}
interface MathOperartor{
public Object operate(int a, int b);
public Object operate(float a, float b);
}
private Object operate(int a, int b, MathOperartor math){
return math.operate(a,b);
}
private Object operate(float a, float b, MathOperartor math){
return math.operate(a,b);
}
请让我知道我在这里做错了什么,并提出解决方法…
更新:
好的,所以我了解了 功能性接口 的概念,我的问题也是关于实现上述代码中我想做的事情,并且发现了几种实现方法。
感谢您的宝贵回答!
甲功能接口必须是一个
SAM 接口:
功能接口只有一种抽象方法。由于默认方法具有实现,因此它们不是抽象的。如果接口声明的抽象方法覆盖了java.lang.Object的公共方法之一,则该方法也不会计入接口的抽象方法计数,因为该接口的任何实现都将具有java.lang.Object或其他地方的实现。
您的接口已声明了2个 抽象 方法,这些 抽象
方法lambda表达式不知道要去哪里,并且lambda表达式是该接口的一个实例,这意味着必须实现接口中声明的所有抽象方法。但是在这种情况下,您可以添加
默认方法 来解决问题,例如:
interface MathOperartor{
//it also can be removed, since a int can cast to a float automatically
default Object operate(int a, int b){
return operate((float)a, (float)b);
}
public Object operate(float a, float b);
}
好的,所以方法重载是一件坏事™。既然这个问题已经解决了,让我们假设我实际上想重载一个像这样的方法: 在Java7中,我可以很容易地使用不明确的匿名类作为参数来调用它们: 但这不能编译。编译器(javac,JDK1.8.0_05)不喜欢这样: 对我来说,直觉上,这没有意义。在产生返回值(“value-compatible”)的lambda表达式和产生(“void-compatible”)的lambd
6.4. 方法值和方法表达式 我们经常选择一个方法,并且在同一个表达式里执行,比如常见的p.Distance()形式,实际上将其分成两步来执行也是可能的。p.Distance叫作“选择器”,选择器会返回一个方法"值"->一个将方法(Point.Distance)绑定到特定接收器变量的函数。这个函数可以不通过指定其接收器即可被调用;即调用时不需要指定接收器(译注:因为已经在前文中指定过了),只要传入
我对Java8的新特性有点陌生。我正在学习如何通过条目过滤地图。我已经看了这个教程和这个帖子我的问题,但我无法解决。
上一讲,主要介绍了用%表达的一种输出格式化表达式。在那一讲最后又拓展了一点东西,拓展的那点,名曰:格式化方法。因为它知识上是使用了str的__format__方法。 现在我们就格式化方法做一个详细一点的交代。 基本的操作 所谓格式化方法,就是可以先建立一个输出字符串的模板,然后用format来填充模板的内容。 >>> #先做一个字符串模板 >>> template = "My name is {0
我想从包含方法调用的字符串中提取参数值。例子: 我需要提取参数值: 我有一个正则表达式在某种程度上是有效的 但这将匹配“KAMP_MR”、“BEZ ASC,下(KAMPNR)ASC”,但我如何将其分割为,?
问题内容: 假设我有一个通用接口: 和方法sort: 我可以调用此方法并将lambda表达式作为参数传递: 那会很好的。 但是现在,如果我将接口设为非泛型,并且将方法设为泛型: 然后像这样调用: 它不会编译。它在lambda表达式中显示错误: “目标方法是通用的” 好的,当我使用编译时,它显示以下错误: 从此错误消息看来,编译器似乎无法推断类型参数。是这样吗 如果是,那为什么会这样呢? 我尝试了各