使用功能界面重试一次

时间:2017-01-01 17:45:10

标签: java asynchronous functional-programming java-8 functional-interface

我是函数式编程(和Java)的新手,我想用它创建一些不错的东西,但是无法弄清楚如何。

我正在使用BiConsumer(java.util.function.BiConsumer)来调用服务器。

我正在尝试编写一个代码,该代码使用现有数据向服务器发送一些请求(调用Public createSomeTask()),只有当它失败时,连接器才会执行一次重试。

代码是异步的,私有的createSomeTask()也调用updateTaskStage()。

问题是我在连接器中有很多调用(很多createSomeTask()) 使用当前的实现,代码看起来不太好,我确信有一种方法可以更好地使用Functional接口或扩展BiConsumer或Java 8 lile,reflection,method invoke等中的任何其他好方法。

请参阅下面的代码。 我希望有人可以帮助我。

{{1}}

1 个答案:

答案 0 :(得分:0)

没有理由检查消费者中的retry标志,因为您可以在将函数传递给updateTaskStage之前编写正确的函数:

private void createSomeTask(
    String taskName, boolean retry, BiConsumer<ServerResponse, ServerError> consumer) {

    BiConsumer<String, ServerError> direct
        = (s, e) -> consumer.accept(e==null? new ServerResponse(): null, e);

    BiConsumer<String, ServerError> actual = retry?
        (string, error) -> {
            if(error!=null) updateTaskStage(direct); else direct.accept(string, null);
        }:
        direct;

    updateTaskStage(actual);
}

首先,创建一个函数,通过将后端的响应转换为提供的使用者。

然后,只有当retrytrue时,该函数才会被另一个函数组成,该函数将在错误情况下进行第二次尝试。对于第二次尝试,可以将直接函数传递给updateTaskStage,从而无需递归。

由于retry参数似乎不是一个选项,而只是你尝试解决问题的一部分,你现在可以摆脱它,当总是执行一次重试时:

public void createSomeTask(
    String taskName, BiConsumer<ServerResponse, ServerError> consumer) {

    BiConsumer<String, ServerError> direct
        = (s, e) -> consumer.accept(e==null? new ServerResponse(): null, e);

    BiConsumer<String, ServerError> actual=
        (string, error) -> {
            if(error!=null) updateTaskStage(direct); else direct.accept(string, null);
        };

    updateTaskStage(actual);
}