通过lambda表达式调用System.out.println()

λ J*_*kas 10 java lambda java-8

在C#中我可以编写以下代码:

public static Action<object> WL = x => Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)

...然后每次我想把一些东西写到控制台我只是打电话:

WL("Some output");
Run Code Online (Sandbox Code Playgroud)

使用Java 8 lambda表达式的等效代码是什么?我尝试了以下内容,但它不起作用:

static void WL = (String s) -> { System.out.println(s); }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 17

你当前的尝试不起作用,因为你试图声明一个类型的变量void- 等效的C#也会失败.您需要声明一个合适的功能接口的变量,就像在C#中使用委托类型一样.

您可以使用lambda表达式执行此操作,但使用方法引用会更清晰(IMO):

import java.util.function.Consumer;

public class Test {
    public static void main(String[] args) {
        Consumer<Object> c1 = x -> System.out.println(x);
        Consumer<Object> c2 = System.out::println;

        c1.accept("Print via lambda");
        c2.accept("Print via method reference");
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的Consumer<T>接口大致相当于Action<T>.NET中的委托.

类似地,您可以在C#中使用方法组转换而不是lambda表达式:

public static Action<object> WL = Console.WriteLine;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,语义差异很小.方法引用不可变地绑定到创建`Consumer`时发现的`System.out`的值,而lambda将在调用`accept`时像往常一样执行语句,之前读取`System.out`叫`println`.当然,这在`System.out` [已更改]时会有所不同(http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#setOut-java.io.仅限PrintStream-). (7认同)