[英]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
不是功能接口 在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.