是否存在可用于任何lambda的无操作(NOP)的方法参考?

Ben*_*Ben 58 java lambda functional-programming java-8

这可能听起来像一个奇怪的问题,但有没有办法在Java 8中引用Lambda的标准无操作(即null操作,空模式方法,无操作,无操作方法)方法.

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

foo(new Consumer<Object>() { 
  public void accept(Object o) { 
    // do nothing 
  }
}
Run Code Online (Sandbox Code Playgroud)

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

foo(Object::null)
Run Code Online (Sandbox Code Playgroud)

代替.有类似存在吗?

不确定多参数方法如何工作 - 也许这是Java中lambdas的缺陷.

fge*_*fge 49

这不是缺陷.

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

但是这个SAM仍然需要有一个有效的原型.在你的情况下,你想要一个无操作的Consumer<T>东西,什么都不做T.

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

private static final Consumer<Object> NOOP = whatever -> {};
Run Code Online (Sandbox Code Playgroud)

NOOP在您需要的地方使用.

  • 如果消费者界面本身有这个功能,那就太好了。 (5认同)

And*_*ira 25

在您的特定情况下,您可以简单地做:

foo(i -> {});
Run Code Online (Sandbox Code Playgroud)

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

  • 也可以扩展任意数量的参数:foo((a,b) - > {}); 等等 (2认同)

Old*_*eon 11

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

返回一个始终返回其输入参数的函数.

  • 好吧,你可以说`Consumer <ArbitraryType> c = Function.identity():: apply;`但问题是这是否真的比`c = ignore - > {};`... (13认同)
  • 这也是我的第一个念头.但是,不幸的是,由于它是一个`Function <T,T>`,它不能用作`Consumer <T>`.OP需要一些不返回的东西. (3认同)
  • 我知道这很愚蠢,但我只是使用了 `Function.identity()::apply; over (v)-&gt;{}` 作为格式化程序将其保留在同一行而不是硬性的 { } XD (3认同)
  • 实际上,我认为我喜欢Function.identity():: apply,因为它不会引入未使用的参数 (2认同)

Pau*_*ton 7

如果你想要一个什么都不做的方法的方法引用,最简单的方法是编写一个什么都不做的方法.请注意,在此示例中,我已Main::doNothingConsumer<String>需要时使用.

class Main {

    static void doNothing(Object o) { }

    static void foo(Consumer<String> c) { }

    public static void main(String[] args) {
        foo(Main::doNothing);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

static void doNothing(Object... o) { }
Run Code Online (Sandbox Code Playgroud)

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

  • @Radiodef我想在我的回答中提到这个,但我决定不喜欢它,因为即使在函数接口的方法返回原始类型的情况下你也可以传递`noop`,这就是要求空指针异常. (2认同)
  • @Radiodef另一个不幸的事情是,返回"U"和"void"的版本的签名具有相同的擦除,因此这些方法必须具有不同的名称,或者它们必须位于不同的类中.就个人而言,我认为**是一个缺陷,像`noop`或`doNothing`这样的东西在"Objects"类中会自然适合. (2认同)

drs*_*a44 6

如果您想要非常接近无操作的东西,您可以使用Objects::requireNonNull.

使用x -> {}当然也可以,但是 IDE 的自动格式化程序可能会尝试将其分成多行。


MNZ*_*MNZ 5

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

static <T> Consumer<T> NOOP() {
    return t -> {};
}
Run Code Online (Sandbox Code Playgroud)