[英]Lambda Expression example not working in java 8
我正在尝试在 java 8 中学习 Lambda 表达式。我确实安装了 eclipse 插件和 java 8 SDK,但是当我尝试执行以下代码时,eclipse 显示错误。
(String s) -> {
s="hello";
System.out.println(s); }
它显示“赋值的左侧必须是变量”错误。
请帮忙。
一个 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
请注意,作为Consumer
,重新分配s
的值实际上没有意义。
我知道这个答案是在提出这个问题很久之后才出现的,但可能会帮助其他人在学习 lambdas 时对我最近遇到的同样问题感到疑惑,并且因为您的问题对于被大量呈现不佳的示例误导的新手有效网。
您的编译器抱怨的原因是 - 示例不完整。 理解不完整代码的一种方法是,它只是上下文的功能部分(缺少示例),通常可以是您自己设计的接口或 Java 8 中预定义的简单接口之一 - 例如 Function 、BiFunction、Predicate 等。此外,在 lambda {working section} 中为您的 String s 提供值“hello”在某种程度上超出了 s 变量的目的。 这是一个更完整的类似功能示例,演示了 3 个字符串变量在 lambda 表达式中的使用:
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
lambda 表达式总是期望分配一个引用。
Java 7 代码:
有效的:
new Hahaha() {
@Override
public void howtolaugh(int number, String sound) {
System.out.println("say "+sound + number + " number of times");
}
};
爪哇 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 表达式中不是这种情况。 它们没有对封闭类的隐式引用,也没有生成不同的类。 它们需要一个显式引用作为方法参数名称,或者左侧的引用对象或返回引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.