java 是否有一个可以用于任何lambda的no-op(NOP)的方法引用?

zqry0prt  于 2022-11-27  发布在  Java
关注(0)|答案(6)|浏览(169)

这听起来可能是一个奇怪的问题,但是在Java8中是否有一种方法可以引用Lambda的标准no-op(也称为空操作、空模式方法、无操作、不做任何事情的方法)方法。
现在,我有一个方法,比如void foo(Consumer<Object>),我想给予它一个no-op,我必须声明:

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

在那里我希望能够做一些类似这样的事情:

foo(Object::null)

类似的东西是否存在?
不确定多参数方法如何工作--也许这是Java中lambda的一个缺陷。

aurhwmvo

aurhwmvo1#

这是没有缺陷的。
Java中的Lambda是函数接口的示例;这些示例可以简化为一个抽象方法,即SAM。
但是这个SAM仍然需要一个有效的原型。在您的例子中,您需要一个no-op Consumer<T>,它不做任何T的事情。
然而,它仍然需要是Consumer<T>;这意味着您可以使用的最小声明是:

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

并在需要的地方使用NOOP

qqrboqgw

qqrboqgw2#

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

foo(i -> {});

这意味着lambda表达式接收到一个参数,但没有返回值。
BiConsumer<T, U>的等效代码为:

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

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

vql8enpb3#

Function.identity()能满足您的需求吗?
返回始终返回其输入参数的函数。

k5ifujac

k5ifujac4#

如果你想要一个不执行任何操作的方法的方法引用,最简单的方法就是编写一个不执行任何操作的方法。注意,在这个例子中,当需要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);
    }
}

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

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

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

nvbavucw

nvbavucw5#

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

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

v1uwarro6#

如果您想要 * 非常接近no-op* 的结果,可以使用Objects::requireNonNull
当然,使用x -> {}也可以,但是IDE的自动格式化程序可能会尝试将其拆分为多行。

相关问题