在 Java 流中使用 printf

L. *_*ell 2 java printf java-8 java-stream

我是使用 lambda 和流的新手。我正在尝试打印一个已排序并删除重复项并格式化的 ArrayList。我知道以下方法会起作用:

list.stream().distinct().forEach(System.out::print);
Run Code Online (Sandbox Code Playgroud)

这将产生 ADFJKLXZ 或我列表中的任何随机字符的输出。但是,我希望输出看起来像 A、D、F、J、K、L、X、Z

我已经尝试过这个:

list.stream().distinct().forEach(System.out::printf("%s, ", ));
Run Code Online (Sandbox Code Playgroud)

我想我可能仍然对 :: 为什么上面的代码不起作用以及我该如何修复它有一些困惑?

rge*_*man 5

您试图在传递显式参数时传递方法引用,但这是无法完成的。您可以替换为 lambda 表达式。

list.stream().distinct().forEach(x -> System.out.printf("%s, ", x) );
Run Code Online (Sandbox Code Playgroud)

此 lambda 表达式是Consumer打印后跟逗号和空格的字符。

如果您仍想使用方法引用,请创建您自己的方法来包装调用printf

public static void printWithCommaSpace(Character c)
{
    System.out.printf("%s, ", c);
}
Run Code Online (Sandbox Code Playgroud)

然后:

list.stream().distinct().forEach(YourClass::printWithCommaSpace);
Run Code Online (Sandbox Code Playgroud)

  • 仅当签名与所调用的方法所需的功能接口类型匹配时,才可以使用方法引用。在这种情况下,“forEach”需要一个仅接受一个参数的“Consumer”。方法引用不会传递显式参数,因为方法引用在语义上并不等同于方法的实际调用,而只是等同于稍后可以调用的功能接口的实现。 (2认同)
  • 实际上,当您使用“System.out::println”形式的方法引用时,您已经绑定了一个值,即您在“System.out”中找到的“PrintStream”实例,将在该实例上调用该方法。因此方法引用最多可以绑定一个值,并且它始终是一个对象,该方法最终将在该对象上调用。另请参阅 [“System.out::println` 的等效 lambda 表达式是什么?”](http://stackoverflow.com/a/28025717/2711488) (2认同)