【问题标题】:How to pass a Java 8 lambda with a single parameter如何使用单个参数传递 Java 8 lambda
【发布时间】:2017-11-25 05:25:20
【问题描述】:

我想简单地传递一个 lambda(代码块)并在需要时执行它。如何在下面的代码中实现方法executeLambda(...)(以及方法签名是什么):

public static void main(String[] args)
{
    String value = "Hello World";
    executeLambda(value -> print(value));
}

public static void print(String value)
{
    System.out.println(value);
}

public static void executeLambda(lambda)
{
    someCode();
    lamda.executeLambdaCode();
    someMoreCode();
}

【问题讨论】:

  • executeLambdaCode()方法声明一个Functional Interface

标签: java lambda java-8


【解决方案1】:

您的 lambda 接受一个参数,但您只将 lambda 传递给 executeLambda,而不是值。如果你想让 lambda 捕获局部变量,不要写它带参数,但如果你真的希望它带一个参数,你可以这样写:

import java.util.function.Consumer;

public static void main(String[] args) {
    String message = "Hello World";
    executeLambda(message, value -> print(value));
}

public static void executeLambda(String value, Consumer<String> lambda) {
    lambda.accept(value);
}

如果您希望它捕获value,则使用Runnable,将lambda 写为() -&gt; print(value),并将其称为runnable.run()

【讨论】:

    【解决方案2】:
    public static void main(String[] args)
    {
        String value = "Hello World";
        executeLambda(() -> print(value));
    }
    
    public static void print(String value)
    {
        System.out.println(value);
    }
    
    public static void executeLambda(Runnable runnable)
    {
        runnable.run();
    }
    

    【讨论】:

      【解决方案3】:

      通过提供合理的参数类型。采用 lambda 的方法不知道 lambdas。

      相反,您可以传递一个 Callable 对象。然后你的方法必须调用该对象的 call() 方法!或者,可以使用 String 的 Runnable 或 Consumer(因为 Callable 应该返回一个值 - 并且您调用的方法是 void)。

      【讨论】:

      • Callable 不是这里的最佳选择,因为它不期望返回值。 Consumer&lt;String&gt; 是更好的选择。
      • 我使用 Lambda 已经有一段时间了,实际上已经通过了我自己的,并且读过一本关于它的书。我面临的挑战是不太清楚如何使用您自己的,几乎所有关于 Lambda 的示例和信息都是关于如何将它们用作参数。例如如何传递一个 lambda 来过滤一个流等。无论哪种方式,在答案中用负面评论来回答通常都不是很好的形式......
      猜你喜欢
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 2019-08-28
      • 2016-04-16
      • 2014-11-10
      • 2015-07-08
      • 2018-08-04
      • 2013-10-26
      相关资源
      最近更新 更多