Код: Выделить всё
static CompletableFuture anySuccess(List futures) {
CompletableFuture delegateFuture = new CompletableFuture();
CompletableFuture.allOf(futures.stream().map(s -> s.thenApply(t -> {
if (t == null) {
// Here we treat null as a failed lookup.
// The inner dummy exception serves as a signal for the caller to return null.
throw new RuntimeException();
}
return t;
}).thenAccept(delegateFuture::complete)).toArray(CompletableFuture[]::new))
.exceptionally(ex -> {
delegateFuture.completeExceptionally(ex);
return null;
});
return delegateFuture;
}
Код: Выделить всё
@Test
void testAnySuccess() {
final byte[] payload1 = "payload1".getBytes();
final byte[] payload2 = "payload2".getBytes();
List futures = Arrays.asList(
CompletableFuture.supplyAsync(
() -> null
),
CompletableFuture.supplyAsync(
() -> {
LockSupport.parkNanos(Duration.ofSeconds(5).toNanos());
System.out.println("Wait for 5 seconds");
return payload2;
}),
CompletableFuture.supplyAsync(
() -> {
LockSupport.parkNanos(Duration.ofMillis(100).toNanos());
System.out.println("Wait for 100ms");
return payload1;
})
);
long start = System.nanoTime();
CompletableFuture res = anySuccess(futures);
byte[] actualRes = res.join();
Assert.assertEquals(actualRes, payload1);
Вот мой ожидаемый результат: вернуть первое ненулевое значение или, если все они равны нулю, вернуть исключение.
Я в замешательстве. о том, нужно ли мне использовать метод allOf -vs-anyOf в данном конкретном случае. Или мне нужно изменить регистр так, чтобы я не использовал метод .Exceptionally(...) и попытался изменить его с помощью thenAccept(...)
Подробнее здесь: https://stackoverflow.com/questions/791 ... ture-allof