【问题标题】:Can I use lambda functions to return something?我可以使用 lambda 函数返回一些东西吗?
【发布时间】:2020-03-21 12:50:35
【问题描述】:

我想使用 lambda 函数返回一个值,但我不能这样做。为什么这不起作用?

public class Main
{
    public static void main(String[] args) {
        System.out.println(() -> {
            String s = "Akhilesh";
            return s;
        });
    }
}

【问题讨论】:

  • 因为您传递了一个函数,而您打算传递一个String
  • 一个 lambda 是一个功能接口的实现。函数式接口是一个只包含一个抽象方法的接口。方法println() 的参数[s] 不是功能接口。
  • 虽然不是完美的复制品,但它几乎等同于stackoverflow.com/q/26828246/2185599。我知道学习事物的一种方法是将事物打印出来,但在这种情况下,您无法使用 lambda 表达式调用 println。尝试将其分配给 Supplier<String> 类型然后运行它的更传统的示例之一。

标签: java lambda


【解决方案1】:

另一个答案已经解释了为什么它不起作用。以下是您可以如何使其工作的方法。简单来说,你必须给 Java 一些关于 lambda 应该变成什么的建议,否则它不会编译。 (我建议接受他们的回答,因为它给出了您的问题的实际原因。我发布这个只是因为我可以理解在学习 Java 时想要打印所有内容以及这必然带来的挫败感。)

import java.util.function.Supplier;
public class Main
{
    public static void main(String[] args) {
        // prints "Main$$Lambda$1/0x0000000801185840@38af3868"
        System.out.println((Supplier<String>) () -> {
            String s = "Akhilesh";
            return s;
        });

        Object obj = (Supplier<String>) () -> {
            String s = "Akhilesh";
            return s;
        };

        Supplier<String> supplier = () -> {
            String s = "Akhilesh";
            return s;
        };

        // prints "Main$$Lambda$2/0x0000000801186040@72ea2f77"
        System.out.println(obj);
        // prints "Main$$Lambda$3/0x0000000801186440@33c7353a"
        System.out.println(supplier);
        // prints "Akhilesh"
        System.out.println(supplier.get());
    }
}

documentation for the java.util.function module

【讨论】:

    【解决方案2】:

    Lambda 表达式是函数式接口的匿名类实现的简写,因此您只能在函数式接口的引用处传递 lambda 表达式。

    println() 有过载,它采用 intfloatArrayListHashMap,但 println() 没有过载,它采用功能接口作为输入,因此您无法通过lambda 表达式。

    【讨论】:

    • @NathanHughes 感谢您提供信息,但他所做的是一个错误,您可以传递一个匿名内部类,那么我肯定是对象的子类,编译器通过接口的名称知道这一点,但是当你传递了一个 lambda ,编译器不知道你在说什么接口,所以是的,系统确实阻止你在 lambdas 的情况下这样做
    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多