Java8函数式编程-需要在类上编写泛型函数
我想创建一个接受如下内容的方法Java8函数式编程-需要在类上编写泛型函数,java,lambda,functional-programming,producer-consumer,Java,Lambda,Functional Programming,Producer Consumer,我想创建一个接受如下内容的方法 set(nodeStatus, status, NodeStatus::setStatus, Status::valueOf); set(nodeStatus, errorCode, NodeStatus::setErrorCode, ErrorCode::valueOf); 状态和错误代码是java中的枚举 签名与伪码 set(NodeStatus nodeStatus, byte[] status, ?nodeStatusOperator , ?ValueT
set(nodeStatus, status, NodeStatus::setStatus, Status::valueOf);
set(nodeStatus, errorCode, NodeStatus::setErrorCode, ErrorCode::valueOf);
状态和错误代码是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中应该使用什么方法签名来实现这一点,以及为什么。我试过各种各样的消费者,双消费者等等,但都做不到。有人能帮忙吗?据我所知,您需要的是:
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);
}
这样称呼它:
set(status, nodeStatus::setStatus, Status::valueOf);
…其中,
nodeStatus
是您想要操纵的nodeStatus
的实例。有点不清楚您想要实现什么。当您可以只传递一个在特定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);
}
OP没有指定他是否允许这样做,但如果允许,我会将其细化为
公共无效集(byte[]value,Consumer setter,Function transformer){t transformedValue=transformer.apply(value);setter.accept(transformedValue);}
,,将状态对象包括到setter方法引用中。然后调用类似于set(status,nodeStatus::setStatus,status::valueOf);set(errorCode,nodeStatus::setErrorCode,errorCode::valueOf)代码>@glglglgl你完全正确,那样看起来会干净得多。我刚刚使用了提供的签名OP,但我将编辑我的答案。谢谢大家-这样快速的响应和对genericsnew String(status)的出色使用在所有枚举中都很常见。类似地,在我的类中,还有多个其他设置器,如Date,其中转换是不同的。还有字符串设置器。此外,我可以对相同类型的多个setter的转换值应用一些常规检查,从而减少代码行。示例:nodeStatus.setupdates(新日期(BinaryUtils.bytestolog(updates))
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)));