Java中的Lambda表达式返回类型

时间:2019-02-20 18:56:44

标签: java lambda java-8

我正在学习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。任何反馈将不胜感激。

4 个答案:

答案 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