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

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

目前,我有一个方法,它接受一个,比如说,我想给它一个no-op,我必须声明:void foo(Consumer<Object>)

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

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

foo(Object::null)

相反。类似的东西存在吗?

不知道这将如何与多参数方法一起工作 - 也许这是Java中lambdas的缺陷。


答案 1

这不是缺陷。

Java中的Lambda是功能接口的实例;反过来,它们被抽象为Java构造的实例,这些实例可以简化为单个抽象方法或SAM。

但是这个SAM仍然需要有一个有效的原型。在你的情况下,你想要一个no-op,无论什么,它都不做任何事情。Consumer<T>T

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

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

并在您需要的地方使用。NOOP


答案 2

在您的特定情况下,您可以简单地执行以下操作:

foo(i -> {});

这意味着 lambda 表达式接收参数但没有返回值。

的等效代码为:BiConsumer<T, U>

void bifoo(BiConsumer<Object, Object> consumer) { ... }

bifoo((a, b) -> {});