有没有可用于任何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 -> {}; }