我是函数式编程(和Java)的新手,我想用它创建一些不错的东西,但是无法弄清楚如何。
我正在使用BiConsumer(java.util.function.BiConsumer)来调用服务器。
我正在尝试编写一个代码,该代码使用现有数据向服务器发送一些请求(调用Public createSomeTask()),只有当它失败时,连接器才会执行一次重试。
代码是异步的,私有的createSomeTask()也调用updateTaskStage()。
问题是我在连接器中有很多调用(很多createSomeTask()) 使用当前的实现,代码看起来不太好,我确信有一种方法可以更好地使用Functional接口或扩展BiConsumer或Java 8 lile,reflection,method invoke等中的任何其他好方法。
请参阅下面的代码。 我希望有人可以帮助我。
{{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);
}
首先,创建一个函数,通过将后端的响应转换为提供的使用者。
然后,只有当retry
为true
时,该函数才会被另一个函数组成,该函数将在错误情况下进行第二次尝试。对于第二次尝试,可以将直接函数传递给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);
}