是的,这可以在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);
}
}