我想创建一个接受如下内容的方法
set(nodeStatus, status, NodeStatus::setStatus, Status::valueOf);
set(nodeStatus, errorCode, NodeStatus::setErrorCode, ErrorCode::valueOf);Status和ErrorCode是java中的枚举。
签名和伪代码
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.
}我想知道在java中应该使用什么方法签名来实现这一点,为什么。我尝试了各种消费者,BiConsumers等,但无法做到这一点。有人能帮帮忙吗?
发布于 2019-03-07 21:13:52
据我所知,你需要的是:
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);
}(如果value可以是byte[]以外的类型,则可以用另一个类型参数替换它。)
附注:setter是一个BiConsumer,因为您在实例方法上使用静态方法引用(例如NodeStatus::setErrorCode),所以BiConsumer的第一个参数必须是要调用的NodeStatus实例setErrorCode()。
附注:正如glglgl所指出的,您可以将您的代码简化为:
public <T> void set (byte [] value,
Consumer<T> setter,
Function<byte[],T> transformer) {
T transformedValue = transformer.apply(value);
setter.accept(transformedValue);
}然后这样叫它:
set(status, nodeStatus::setStatus, Status::valueOf);...where nodeStatus是您要操作的NodeStatus实例。
发布于 2019-03-07 21:24:59
这有点不清楚你想要实现什么。当您可以只传递一个在特定NodeStatus实例上工作的函数时,为什么要传递NodeStatus和函数,例如:
static <T> void set(byte[] status, Consumer<T> nodeStatusOperator, Function<String, T> transformer) {
nodeStatusOperator.accept(transformer.apply(new String(status)));
}
public static void main(String[] args) {
NodeStatus nodeStatus = new NodeStatus();
byte[] status = new byte[0];
set(status, nodeStatus::setStatus, Status::valueOf);
set(status, nodeStatus::setErrorCode, ErrorCode::valueOf);
}与更直接的方法相比,这种通用性给您带来了什么?
nodeStatus.setStatus(Status.valueOf(new String(status)));
nodeStatus.setErrorCode(ErrorCode.valueOf(new String(status)));https://stackoverflow.com/questions/55044589
复制相似问题