Lambda表达式给出了无效的令牌" Java中的语法错误

时间:2014-12-05 17:54:20

标签: java arguments java-8 lambda

我刚开始学习Lambda Expression,我做了类似的事情:

public class LambdaTest {

    public static void main(String[] args) {
        int num = returnNumber((num) -> { return 4 });
    }

    public static int returnNumber(int num) {
        return num;
    }
}

但它给了我一个错误:"无效的令牌"。这是一张图片:

有人可以解释一下我的错误吗?这只是一个考验。

我的Eclipse安装支持Java 1.8(Luna 4.4)。

3 个答案:

答案 0 :(得分:1)

  

在lambda的主体中可以做什么有一些限制,其中大部分是非常直观的 - 一个lambda体不能“破坏”或“继续”出lambda,如果lambda返回一个值,每个代码路径必须返回一个值或抛出异常,依此类推。这些规则与标准Java方法的规则大致相同,所以它们不应该太令人惊讶。

参考:http://www.oracle.com/technetwork/articles/java/architect-lambdas-part1-2080972.html

  

该方法的主体具有评估lambda体的效果,如果它   是一个表达式,或者执行lambda主体,如果它是一个块;   如果预期结果,则从方法返回。

     

如果函数类型的结果为void,则lambda主体为a   语句表达式或与void兼容的块。

参考:http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.4

答案 1 :(得分:1)

语法错误非常简单。它表示在语句之后缺少;,并且除了lambda表达式之外的语句之外没有任何其他方法。如果你写(num) -> { return 4 }return 4之后必须有一个分号,因为它必须出现在你可以写return 4的每一个地方(我很惊讶为什么没有其他人能说出来那个)。

你可以用两种方式写一个lambda表达式返回int,或者像(num) -> { return 4; }一样,或者更简单一样,用num -> 4(这里没有分号)。

但是,当然,您不能使用lambda表达式作为参数调用returnNumber(int num),因为它需要int而不是函数interface。一旦修复了缺失分号的结构语法错误,您的编译器就会告诉您。

答案 2 :(得分:0)

Lambdas只是函数接口方法的实现(具有一个抽象方法的接口),但是在

的情况下
returnNumber(int num)

不能使用lambdas,因为:

  • int不是功能界面
  • 所以lambdas不能用于提供其唯一的抽象方法的实现(因为原始类型是原始的 - 它们没有方法)。

在lambda执行

之类的方法之前
method(SomeInterface si){...}

您需要创建单独的类来实现此接口

class MyClass implements SomeInterface{
    void method(Type1 arg1, Type2 arg2){
        //body
    }
}

...
MyClass mc = new MyClass();
method(md);

或通过创建匿名类

来添加其实现
method(new SomeInterface{
    void method(Type1 arg1, Type2 arg2){
        //body
    }
});

Lambdas可以通过跳过这个习惯来缩短这个过程,让你只关注参数类型和实现。

所以而不是

new SomeInterface{
    void method(Type1 arg1, Type2 arg2){
        //body
    }
}

你可以简单地写

(Type1 arg1, Type2 arg2) -> { body } // you can actually shorten it even farther 
                                     // but that is not important now