首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8函数式编程-需要在class上编写泛型函数

Java 8函数式编程-需要在class上编写泛型函数
EN

Stack Overflow用户
提问于 2019-03-07 21:09:28
回答 2查看 295关注 0票数 4

我想创建一个接受如下内容的方法

代码语言:javascript
复制
set(nodeStatus, status, NodeStatus::setStatus, Status::valueOf);
set(nodeStatus, errorCode, NodeStatus::setErrorCode, ErrorCode::valueOf);

Status和ErrorCode是java中的枚举。

签名和伪代码

代码语言:javascript
复制
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等,但无法做到这一点。有人能帮帮忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-07 21:13:52

据我所知,你需要的是:

代码语言:javascript
复制
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所指出的,您可以将您的代码简化为:

代码语言:javascript
复制
public <T> void set (byte [] value, 
                     Consumer<T> setter, 
                     Function<byte[],T> transformer) {
    T transformedValue = transformer.apply(value);
    setter.accept(transformedValue);
}

然后这样叫它:

代码语言:javascript
复制
set(status, nodeStatus::setStatus, Status::valueOf);

...where nodeStatus是您要操作的NodeStatus实例。

票数 4
EN

Stack Overflow用户

发布于 2019-03-07 21:24:59

这有点不清楚你想要实现什么。当您可以只传递一个在特定NodeStatus实例上工作的函数时,为什么要传递NodeStatus和函数,例如:

代码语言:javascript
复制
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);
}

与更直接的方法相比,这种通用性给您带来了什么?

代码语言:javascript
复制
nodeStatus.setStatus(Status.valueOf(new String(status)));
nodeStatus.setErrorCode(ErrorCode.valueOf(new String(status)));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55044589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档