我正在尝试在java 8中学习Lambda Expression。我确实安装了eclipse插件和java 8 SDK但是当我尝试执行以下代码时,eclipse显示错误。
(String s) -> {
s="hello";
System.out.println(s); }
显示“作业的左侧必须是变量”错误。
请帮忙。
答案 0 :(得分:7)
lambda表达式(和方法引用)仅在需要某个功能接口实例的上下文中才有意义。否则就无法确定lambda是否有效(并且因为你没有对它做任何事情也没用)。
像
这样的东西Consumer<String> c = (String s) -> {
s = "hello";
System.out.println(s);
}; // as a Consumer, it doesn't really make sense for you to change s
答案 1 :(得分:0)
我知道这个答案在提出问题后很久就会出现,但可能会帮助其他人对我最近所遇到的同样问题感到疑惑,同时了解lambdas,并且因为你的问题对于一个被大量不良呈现错误的新手有效网上的例子。
您的编译器抱怨的原因是 - 示例不完整。理解不完整代码的一种方法是,它只是上下文的功能部分(缺少示例),它通常可以是您自己设计的接口,也可以是Java 8中预定义的简单接口之一 - 例如Function ,BiFunction,谓词等 另外,提供价值&#34;你好&#34; lambda {working section}里面的String s稍微超过了s变量的目的。下面是一个更完整的类似功能示例,演示如何在lambda表达式中使用3个String变量:
public class LambdaTest {
// define your interface
interface Use_3_Strings {
void apply(String s1, String s2, String s3);
}
// define a test method
public void lambdaTest1(String str1, String str2, String str3) {
// your lambda expression
// defining what to do inside { }
// - like a method having 3 String parameters (s1, s2, s3)
Use_3_Strings use3strings = (s1, s2, s3) -> { System.out.println("Working with 3 strings:");
System.out.println(" String 1: " + s1);
System.out.println(" String 2: " + s2);
System.out.println(" String 3: " + s3);
StringBuilder sb = new StringBuilder();
sb.append("CSV of 3 strings:\n");
sb.append(s1);
sb.append(", ");
sb.append(s2);
sb.append(", ");
sb.append(s3);
System.out.println(sb); };
// your lambda expression in action
// executing what you coded inside { } above
use3strings.apply(str1, str2, str3);
}
}
在main()方法中,然后执行:
LambdaTest lambdaTst = new LambdaTest();
lambdaTst .lambdaTest1("Hello", "beautiful", "world");
你应该得到:
Working with 3 strings:
String 1: Hello
String 2: beautiful
String 3: world
CSV of 3 strings:
Hello, beautiful, world
答案 2 :(得分:0)
lambda表达式总是希望指定一个引用。
Java 7代码:
有效:
new Hahaha() {
@Override
public void howtolaugh(int number, String sound) {
System.out.println("say "+sound + number + " number of times");
}
};
Java 8:
无效:
(int i, String sound) -> System.out.println("say "+sound + i + " number of times");
虽然这两个目的是相同的,但第一个是内部阶级。内部类具有对封闭类的默认引用。对它们进行反编译时,会以<Enclosing_Class_Name>$<a_number>.class
或<Enclosing_Class_Name>$<a_number>.class
格式为它们生成不同的类文件。例如:TestClass $ 1.class。
lambda表达式不是这种情况。它们没有对封闭类的隐式引用,也没有生成不同的类。它们需要显式引用作为方法参数名称,或左侧的引用对象或返回引用。