Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8函数式编程-需要在类上编写泛型函数_Java_Lambda_Functional Programming_Producer Consumer - Fatal编程技术网

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)));