private CompletableFuture<Stream<SimpleMailboxMessage>> expungeUidChunk(CassandraId mailboxId, Collection<MessageUid> uidChunk) { return FluentFutureStream.of( uidChunk.stream().map(uid -> retrieveComposedId(mailboxId, uid)), FluentFutureStream::unboxOptional) .performOnAll(this::deleteUsingMailboxId) .map(idWithMetadata -> FluentFutureStream.of( messageDAO.retrieveMessages(ImmutableList.of(idWithMetadata), FetchType.Metadata, Limit.unlimited())), FluentFutureStream::unboxFluentFuture) .filter(CassandraMessageDAO.MessageResult::isFound) .map(CassandraMessageDAO.MessageResult::message) .map(pair -> pair.getKey().toMailboxMessage(ImmutableList.of())) .completableFuture(); }
@Test void thenPerformOnAllShouldGenerateASynchronousSideEffectForAllElementsOfTheUnderlyingStream() { ConcurrentLinkedDeque<Integer> sideEffects = new ConcurrentLinkedDeque<>(); FluentFutureStream.of( CompletableFuture.completedFuture( Stream.of(1, 2, 3))) .performOnAll(i -> { sideEffects.addLast(i); return CompletableFuture.completedFuture(null); }) .join() .collect(Guavate.toImmutableList()); assertThat(sideEffects).containsOnly(1, 2, 3); }
@Test public void thenPerformOnAllShouldGenerateASynchronousSideEffectForAllElementsOfTheUnderlyingStream() { ConcurrentLinkedDeque<Integer> sideEffects = new ConcurrentLinkedDeque<>(); FluentFutureStream.of( CompletableFuture.completedFuture( Stream.of(1, 2, 3))) .performOnAll(i -> { sideEffects.addLast(i); return CompletableFuture.completedFuture(null); }) .join() .collect(Guavate.toImmutableList()); assertThat(sideEffects).containsOnly(1, 2, 3); }