是否有可用于任何 lambda 的空操作 (NOP) 的方法参考?

Is there a method reference for a no-op (NOP) that can be used for anything lambda?

这听起来像是一个奇怪的问题,但是有没有办法在Java8.

目前,我有一个方法需要一个,比如说,void foo(Consumer<Object>),我想给它一个空操作,我必须声明:

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

我希望能够执行以下操作的地方:

foo(Object::null)

相反。是否存在类似的东西?

不确定如何使用多参数方法 - 也许这是 Java 中 lambda 的缺陷。

这不是缺点。

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

但是这个SAM还需要有一个有效的原型。在你的情况下,你想要一个空操作 Consumer<T> 它什么都不做 T.

但是仍然需要 Consumer<T>;这意味着您可以提出的最小声明是:

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

并在需要的地方使用 NOOP

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

foo(i -> {});

这意味着 lambda 表达式接收了一个参数但没有 return 值。

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

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

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

能否Function.identity()满足您的需求?

Returns a function that always returns its input argument.

如果您想要一个什么都不做的方法的方法引用,最简单的方法是编写一个什么都不做的方法。请注意,在本例中,当需要 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);
    }
}

您还可以通过提供使用可变参数的版本来重载 doNothing

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

此签名几乎可以接受任何参数序列(甚至是原始参数,因为这些参数将被自动装箱)。这样,只要功能接口的方法具有 void return 类型,您就可以传递 Main::doNothing 。例如,您可以在需要 ObjLongConsumer<Integer> 时传递 Main::doNothing

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

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

如果您想要非常接近no-op的东西,并且您已经在类路径中安装了 Guava,则可以使用 Preconditions::checkNotNull.

使用 x -> {} 当然也可以,但是您的 IDE 的 auto-formatter 可能会尝试将其分成多行。