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?
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 value
puede ser algo distinto byte[]
, puede sustituirla por otro tipo de parámetro.)
Ps: setter
es 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 BiConsumer
tiene que ser la NodeStatus
instancia 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 nodeStatus
es la instancia de NodeStatus
que desea manipular.