我正在学习Java中的Lambda,并且我试图理解它。例如,我有以下代码:
@FunctionalInterface
interface Square
{
int calculate(int x);
}
class Test
{
public static void main(String args[])
{
int a = 5;
Square s = (int x) -> x*x;
int ans = s.calculate(a);
System.out.println(ans);
}
}
我不理解该语句Square s = (int x) -> x*x;
,我看到s
是类型Square
的引用变量。但是我不知道这个(int x) -> x*x
到底是什么。这是方法定义吗?此方法的返回类型是什么?我认为应该是int
,因为calculate
方法的返回类型是int
。任何反馈将不胜感激。
答案 0 :(得分:5)
您的lambda表达式可以被匿名类替换:
Square s = new Square() {
@Override
public int calculate(int x) {
return x * x;
}
};
因此(int x) -> x*x
只是calculate
方法的实现,该方法采用int
参数并返回int
值。顺便说一句,没有必要指定参数类型。你可以这样:
Square s = x -> x*x;
现在您有了类型Square
的对象,并且可以调用之前在lambda表达式中定义的calculate
方法:
int squared = s.calculate(5);
答案 1 :(得分:1)
这是lambda语法。它是...的语法糖。
Square s = new Square ()
{
@Override
public int calculate (int x)
{
return x*x;
}
}
答案 2 :(得分:1)
lambda也可以被认为是定义(或重新定义)抽象函数的快速方法。 (他们称其为语法糖。)因此,您也可以这样写:
Square s;
s = x -> x*x;
System.out.println (s.calculate(5)); // 25
正在发生的事情是您正在填写函数声明的空白。参数为'x',函数的主体(Java中的方法)为'return x * x'。
考虑下一步可以执行以下操作:(注意,要添加花括号以支持多行块。返回然后显式声明。此外,输入类型也可以显式声明-可视指示器引用超载。)
s = (int x) -> { return x*x*x ; } ; // brackets allow multi-line operations
System.out.println (s.calculate(2)); // 8
因此,可以通过一种非常简捷的机制将新操作动态地重新分配给抽象方法。
考虑该接口还可以定义如下内容:
int calculate(String x); // note change in argument type -- overloading
到那时,您可以执行以下操作:(s的类型为String。)
s = s -> { return s.length()*2 ; } ;
System.out.println (s.calculate("It!")); // 6
最重要的是,lambda提供了一种非常灵活且简捷的方法来即时定义和重新定义方法。
答案 3 :(得分:0)
Square接口中的calculate方法接受一个int并返回一个int,但是由于没有像其他方法一样没有方法主体{.......},因此没有实现如何计算返回值的逻辑实现你可能知道。
因此,您拥有的代码段不是指向int而是实现了逻辑(如何计算)。名称“ Square”可能会引起误解,但以下表达式有效:
Square s = (int x) -> x*x; // your example
Square s1 = (int x) -> x*x*x; // takes an int x and returns the cube of x
Square s2 = (int x) -> x+42; // takes an int x and returns x+42
Square s3 = (int x) -> x%2; // takes an int and returns 0 if x is even 1 otherwise