これは奇妙な質問のように聞こえるかもしれませんが、Java 8。
現在、たとえばvoid foo(Consumer<Object>)
をとるメソッドがあり、何もしないようにするには、宣言する必要があります。
foo(new Consumer<Object>() {
public void accept(Object o) {
// do nothing
}
}
私は次のようなことをできるようにしたいところ:
foo(Object::null)
代わりに。のようなものはありますか?
これがマルチパラメーターメソッドでどのように機能するかはわかりません。おそらく、これはJavaのラムダの欠陥です。
これは欠陥ではありません。
Javaのラムダは、機能的インターフェースのインスタンスです。これは、Java one単一の抽象メソッド、またはSAM。
ただし、このSAMにはまだ有効なプロトタイプが必要です。あなたの場合は、T
が何であれ何もしない、何もしないConsumer<T>
が必要です。
ただし、Consumer<T>
である必要があります。つまり、考えられる最小限の宣言は次のとおりです。
private static final Consumer<Object> NOOP = whatever -> {};
必要な場所でNOOP
を使用します。
あなたの特定のケースでは、単に次のことができます:
foo(i -> {});
つまり、ラムダ式はパラメーターを受け取りますが、戻り値はありません。
Function.identity()
ニーズに適合しますか?
入力引数を常に返す関数を返します。
何もしないメソッドのメソッド参照が必要な場合、最も簡単な方法は、何もしないメソッドを記述することです。この例では、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>
を渡すことができます。
Function.Identityと同様に、独自のNOOP実装を使用できます。
static <T> Consumer<T> NOOP() {
return t -> {};
}