繁体   English   中英

Lambda表达式在Java中给出“无效令牌”语法错误

[英]Lambda expression gives “invalid tokens” syntax error in Java

我刚刚开始学习Lambda表达式,并且做了类似的事情:

public class LambdaTest {

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

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

但这给了我一个错误:“无效令牌”。 这是一张图片:

有人可以告诉我怎么了吗? 这只是一个测试。

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

在lambda主体中可以执行的操作有一些限制,其中大多数是非常直观的-lambda主体无法“中断”或“继续”离开lambda,并且如果lambda返回值,每个代码路径都必须返回一个值或引发异常,依此类推。 这些规则与标准Java方法基本相同,因此不要太惊讶。

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

该方法的主体具有评估lambda主体(如果是表达式)或执行lambda主体(如果是块)的作用; 如果期望结果,则从方法中返回。

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

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

语法错误非常简单。 它说有一个; 在语句后丢失,除了在lambda表达式之外的语句外,这无非。 如果您写(num) -> { return 4 } ,则在return 4之后必须有一个分号,因为它必须出现在每个您可以写return 4 (我很惊讶为什么没有人能够告诉您)。

您可以编写以两种方式返回int的lambda表达式,例如(num) -> { return 4; } (num) -> { return 4; }或者更简单一些,例如num -> 4 (这里没有分号)。

但是,当然,您不能使用lambda表达式作为参数来调用returnNumber(int num) ,因为它期望一个int而不是一个函数interface 您的编译器会告诉您,一旦解决了丢失的分号的结构语法错误。

Lambda只是功能接口方法(具有一种抽象方法的接口)的实现,但在

returnNumber(int num)

无法使用lambda,因为:

  • int不是功能接口
  • 因此lambda不能用于提供其唯一抽象方法的实现(因为基本类型是基本类型-它们没有方法)。

在lambdas之前执行类似的方法

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
    }
});

Lambda可以跳过此惯用语,而让您仅关注参数类型和实现,从而缩短此过程。

所以代替

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM