web-dev-qa-db-ja.com

ラムダに使用できるノーオペレーション(NOP)のメソッドリファレンスはありますか?

これは奇妙な質問のように聞こえるかもしれませんが、Java 8。

現在、たとえばvoid foo(Consumer<Object>)をとるメソッドがあり、何もしないようにするには、宣言する必要があります。

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

私は次のようなことをできるようにしたいところ:

foo(Object::null)

代わりに。のようなものはありますか?

これがマルチパラメーターメソッドでどのように機能するかはわかりません。おそらく、これはJavaのラムダの欠陥です。

55
Ben

これは欠陥ではありません。

Javaのラムダは、機能的インターフェースのインスタンスです。これは、Java one単一の抽象メソッド、またはSAM。

ただし、このSAMにはまだ有効なプロトタイプが必要です。あなたの場合は、Tが何であれ何もしない、何もしないConsumer<T>が必要です。

ただし、Consumer<T>である必要があります。つまり、考えられる最小限の宣言は次のとおりです。

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

必要な場所でNOOPを使用します。

48
fge

あなたの特定のケースでは、単に次のことができます:

foo(i -> {});

つまり、ラムダ式はパラメーターを受け取りますが、戻り値はありません。

24
Anderson Vieira

Function.identity() ニーズに適合しますか?

入力引数を常に返す関数を返します。

10
OldCurmudgeon

何もしないメソッドのメソッド参照が必要な場合、最も簡単な方法は、何もしないメソッドを記述することです。この例では、Main::doNothingが必要なときにConsumer<String>を使用していることに注意してください。

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を渡すことができます。たとえば、Main::doNothingが必要なときにObjLongConsumer<Integer>を渡すことができます。

7
Paul Boddington

Function.Identityと同様に、独自のNOOP実装を使用できます。

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