我刚开始学习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)。
答案 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
不是功能界面在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