Java 8 Funcional de programación - Necesidad de escribir una función genérica de la clase

Nishant Lakhara:

Quiero crear un método que acepta algo como esto

set(nodeStatus, status, NodeStatus::setStatus, Status::valueOf);
set(nodeStatus, errorCode, NodeStatus::setErrorCode, ErrorCode::valueOf);

De estado y código de error son las enumeraciones en Java.

Firma y pseudocódigo

set(NodeStatus nodeStatus, byte[] status, ?nodeStatusOperator , ?ValueTransformer) {
   1. convert byte[] status to appropriate value as per ValueTransformer
   2. nodeStatusOperator sets this transformed value according to the lambda passed.
}

Quiero saber qué firma del método se debe utilizar para accompalish esto en Java y por qué. Probé varios consumidores, BiConsumers, etc, pero no podía hacer esto. Alguien puede ayudarme porfavor?

biziclop:

Por lo que yo puedo decir, lo que necesita es la siguiente:

public <T> void set (NodeStatus nodeStatus, 
                     byte [] value, 
                     BiConsumer<NodeStatus,T> setter, 
                     Function<byte[],T> transformer) {
    T transformedValue = transformer.apply(value);
    setter.accept(nodeStatus, transformedValue);
}

(Si valuepuede ser algo distinto byte[], puede sustituirla por otro tipo de parámetro.)

Ps: setteres una BiConsumer, porque utiliza una referencia método estático (por ejemplo NodeStatus::setErrorCode) en un método de instancia, por lo que el primer argumento de BiConsumertiene que ser la NodeStatusinstancia setErrorCode()será llamada.

PPS: Como se ha señalado por glglgl , que potencialmente puede simplificar el código a la siguiente:

public <T> void set (byte [] value, 
                     Consumer<T> setter, 
                     Function<byte[],T> transformer) {
    T transformedValue = transformer.apply(value);
    setter.accept(transformedValue);
}

Y lo llaman así:

set(status, nodeStatus::setStatus, Status::valueOf);

... donde nodeStatuses la instancia de NodeStatusque desea manipular.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=204304&siteId=1
Recomendado
Clasificación