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>
.