繁体   English   中英

Lambda 表达式示例在 Java 8 中不起作用

[英]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.

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