有没有可用于任何lambda的无操作(NOP)的方法引用?

这可能听起来像一个奇怪的问题,但是有没有办法引用Java 8中的Lambda的标准no-op(aka null操作,null-pattern方法,no-operation,do-nothing方法)方法。

目前,我有一个方法,采取一个,例如, void foo(Consumer<Object>) ,我想给它一个无操作,我必须声明:

 foo(new Consumer<Object>() { public void accept(Object o) { // do nothing } } 

我希望能够做到这样的事情:

 foo(Object::null) 

代替。 有这样的东西存在吗?

不知道如何使用多参数方法 – 也许这是Java中的lambdaexpression式的一个缺陷。

这不是不足。

Java中的Lambdas是函数接口的实例; 而这又被抽象为可以简化为单一抽象方法的Java构造的实例,或SAM。

但是这个SAM仍然需要一个有效的原型。 在你的情况下,你想要一个没有任何东西的Consumer<T>

然而,它仍然需要成为一个Consumer<T> 这意味着你可以想出最小的声明是:

 private static final Consumer<Object> NOOP = whatever -> {}; 

并在需要的地方使用NOOP

在你的具体情况下,你可以简单地做:

 foo(i -> {}); 

这意味着lambdaexpression式接收一个参数,但没有返回值。

Function.identity()可以满足你的需求吗?

返回一个总是返回其input参数的函数。

如果你想为一个什么都不做的方法引用,最简单的方法就是编写一个什么都不做的方法。 请注意,在这个例子中,当需要一个Consumer<String>时,我使用了Main::doNothing

 class Main { static void doNothing(Object o) { } static void foo(Consumer<String> c) { } public static void main(String[] args) { foo(Main::doNothing); } } 

你也可以通过使用可变参数提供一个版本来重载。

 static void doNothing(Object... o) { } 

这个签名将接受字面上的任何序列的参数(甚至原语,因为这些将被自动装箱)。 这样,只要函数接口的方法具有void返回types,就可以传递Main::doNothing 。 例如,当需要ObjLongConsumer<Integer>时,可以传递Main::doNothing

您可以拥有自己的NOOP实现,类似于Function.Identity。

 static <T> Consumer<T> NOOP() { return t -> {}; }