usuario tutorial interfaz gui grafica español componentes java lambda functional-programming java-8

java - tutorial - ¿Existe una referencia de método para un no-op(NOP) que se pueda usar para algo lambda?



java swing (5)

Esto puede parecer una pregunta extraña, pero hay una manera de referirse a un método estándar sin operación (también conocido como operación nula, método de patrón nulo, no operación, método de no hacer nada) para un Lambda en Java 8.

Actualmente, tengo un método que requiere, por ejemplo, void foo(Consumer<Object>) , y quiero darle un no-op, tengo que declarar:

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

donde me gustaría poder hacer algo como:

foo(Object::null)

en lugar. ¿Existe algo como eso?

No estoy seguro de cómo funcionaría eso con los métodos de parámetros múltiples; tal vez esta es una deficiencia en las lambdas en Java.


¿Podría Function.identity() satisfacer sus necesidades?

Devuelve una función que siempre devuelve su argumento de entrada.


En su caso particular, simplemente podría hacer:

foo(i -> {});

Esto significa que la expresión lambda recibe un parámetro pero no tiene valor de retorno.


Esto no es deficiencia.

Las lambdas en Java son instancias de interfaces funcionales; que, a su vez, se abstraen en instancias de construcciones Java que se pueden simplificar a un único método abstracto, o SAM.

Pero este SAM todavía necesita tener un prototipo válido. En su caso, desea tener un Consumer<T> no operativo Consumer<T> que no hace nada más que la T

Sin embargo, todavía debe ser un Consumer<T> ; lo que significa que la declaración mínima que se te ocurre es:

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

y usa NOOP donde lo necesites.


Puede tener su propia implementación de NOOP, similar a Function.Identity.

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


Si desea una referencia de método para un método que no hace nada, la forma más fácil es escribir un método que no haga nada. Observe que en este ejemplo he usado Main::doNothing cuando se Main::doNothing un Consumer<String> .

class Main { static void doNothing(Object o) { } static void foo(Consumer<String> c) { } public static void main(String[] args) { foo(Main::doNothing); } }

También podría sobrecargar doNothing proporcionando una versión con varargs.

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

Esta firma aceptará literalmente cualquier secuencia de parámetros (incluso primitivos, ya que estos se autoencadenarán). De esa manera, podría pasar Main::doNothing siempre que el método de la interfaz funcional tenga un tipo de retorno void . Por ejemplo, puede pasar Main::doNothing cuando se ObjLongConsumer<Integer> un ObjLongConsumer<Integer> .