当前位置: 首页 > 面试题库 >

Java 8-重试方法,直到满足条件(间隔)

佴淮晨
2023-03-14
问题内容

我想创建一个类,该类可以运行一种方法,直到满足有关返回值的条件为止。

它应该看起来像这样

methodPoller.poll(pollDurationSec, pollIntervalMillis)
            .method(dog.bark())
            .until(dog -> dog.bark().equals("Woof"))
            .execute();

我的方法轮询器看起来像这样()//在GuiSim回答之后

public class MethodPoller {
    Duration pollDurationSec;
    int pollIntervalMillis;


    public MethodPoller() {
    }

    public MethodPoller poll(Duration pollDurationSec, int pollIntervalMillis) {
        this.pollDurationSec = pollDurationSec;
        this.pollIntervalMillis = pollIntervalMillis;
        return this;
    }

    public <T> MethodPoller method(Supplier<T> supplier) {

        return this;
    }

    public <T> MethodPoller until(Predicate<T> predicate) {

        return this;
    }
}

但是我很难从这里开始。
在满足条件之前,如何实现对通用方法的重试?
谢谢。


问题答案:

是的,这可以在Java 7中轻松完成,甚至可以使用Java 8进行更清洁的操作。

method方法的参数应为java.util.function.Supplier<T>until方法的参数应为java.util.function.Predicate<T>

然后,您可以使用方法引用或lambda表达式来创建Poller,如下所示:

myMethodPoller.poll(pollDurationInteger, intervalInMillisecond)
          .method(payment::getStatus)
          .until (paymentStatus -> paymentStatus.getValue().equals("COMPLETED"))
          .execute();

附带说明一下,如果您要使用Java 8,建议您使用java.time.Duration而不是整数来表示轮询持续时间和间隔。

我还建议您查看https://github.com/rholder/guava-
retrying
,这是您可能会使用的库。如果没有,这可能是您的API的良好灵感,因为它具有出色的流畅API。

编辑:对问题的更新之后,这是一个简单的实现。我剩下一些部分供您完成TODO。

import java.time.Duration;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class MethodPoller<T> {

    Duration pollDurationSec;
    int pollIntervalMillis;

    private Supplier<T> pollMethod = null;
    private Predicate<T> pollResultPredicate = null;

    public MethodPoller() {
    }

    public MethodPoller<T> poll(Duration pollDurationSec, int pollIntervalMillis) {
        this.pollDurationSec = pollDurationSec;
        this.pollIntervalMillis = pollIntervalMillis;
        return this;
    }

    public MethodPoller<T> method(Supplier<T> supplier) {
        pollMethod = supplier;
        return this;
    }

    public MethodPoller<T> until(Predicate<T> predicate) {
        pollResultPredicate = predicate;
        return this;
    }

    public T execute()
    {
        // TODO: Validate that poll, method and until have been called.

        T result = null;
        boolean pollSucceeded = false;
        // TODO: Add check on poll duration
        // TODO: Use poll interval
        while (!pollSucceeded) {
            result = pollMethod.get();
            pollSucceeded = pollResultPredicate.test(result);
        }

        return result;
    }
}

样品使用:

import static org.junit.Assert.assertTrue;
import java.util.UUID;
import org.junit.Test;

public class MethodPollerTest
{

    @Test
    public void test()
    {
        MethodPoller<String> poller = new MethodPoller<>();
        String uuidThatStartsWithOneTwoThree = poller.method(() -> UUID.randomUUID().toString())
                                                     .until(s -> s.startsWith("123"))
                                                     .execute();
        assertTrue(uuidThatStartsWithOneTwoThree.startsWith("123"));
        System.out.println(uuidThatStartsWithOneTwoThree);
    }
}


 类似资料:
  • 所以我必须在eclipse中为我的类创建一个java项目。分配是创建一个程序,允许用户在程序中输入整数,直到输入某个整数(42)。输入整数(42)后,程序将为1。平均输入的所有数字。2、显示输入的最小值和最大值。3、输入的数字总数。这些必须在不计算(42)的情况下进行计算。这就是我目前所拥有的。我可以从用户那里获得输入,一旦他们输入42,程序就会停止并显示总数,但包括42。我不知道如何为输入添加一

  • 问题内容: 我需要让用户输入一个数字以用作范围的开始,然后输入另一个数字作为范围的结束。起始编号必须为0或更大,结束编号不能大于1000。两个数字都必须被10整除。我找到了满足这些条件的方法,但是如果不满足这些条件,我的程序只会告诉用户他们的输入不正确。我是否可以对它进行编码,以便在用户输入后进行检查以确保满足条件,如果条件没有环回,请再次输入。这是我到目前为止的代码。 问题答案: 轻松做:

  • 我需要要求用户输入一个数字作为范围的开始,然后输入另一个数字作为范围的结束。开始数必须大于等于0,结束数不能大于1000。两个数字都必须能被10整除。我已经找到了满足这些条件的方法,但是如果不满足这些条件,我的程序只会告诉用户他们的输入不正确。我是否可以对其进行编码,以便在用户输入后,它将检查以确保满足条件,如果不满足条件,则返回并再次输入。这是我目前掌握的代码。

  • 我想退订一个可观察的带带直到在任何情况下,数字不等于5。如果数字是5想做某事,稍后退订,但它不起作用。 这是我的stackblitz链接:https://stackblitz.com/edit/angular-ivy-lpkzyf?file=src/app/app.component.ts 非常感谢。

  • 我试图改变我的想法,以功能的方式思考,最近面临着这样一种情况,我需要从列表中提取元素,直到满足一个条件,我找不到一个简单自然的方法来实现这一点。显然我还在学习。 假设我有这个清单: 提前感谢您的投入 注意:在发布这篇文章之前,我读了用谓词限制流,但是我不知道如何调整这个答案来解决我的问题。任何帮助将不胜感激。

  • 问题内容: 这是我要弄清楚的一个片段: 有一个接受来自外部的事件。有一个订阅该主题的客户端,可以处理事件并对其进行处理。这里的主要思想是,应基于使用流中的项目计算出的某些条件,每次都发出缓冲的项目。 为此,缓冲区边界本身会监听主体。 一项重要的期望行为:每当边界发射该项目时,也应将其包括在以下的发射中。当前配置不是这种情况,因为该项目(至少是我认为的)是 在 它到达 之前 从关闭选择器发出的,因此