From 86e7b7605dd745c2b94262b5bd90dcfda1810bc1 Mon Sep 17 00:00:00 2001 From: Clement Escoffier Date: Sat, 2 Jan 2021 09:44:33 +0100 Subject: [PATCH] Rename collectItems() and groupItems() into collect() and group() following the next to be select() method. - Deprecate previous method and provide the new methods - Update tests, documentation and pictures --- .../context/MultiContextPropagationTest.java | 4 +- documentation/README.md | 4 +- .../jekyll/assets/images/collect-as-list.png | Bin 49832 -> 36844 bytes .../main/jekyll/guides/collecting-items.adoc | 3 +- .../test/java/guides/CompletionStageTest.java | 4 +- .../test/java/guides/CreatingMultiTest.java | 12 +- .../java/guides/HandlingFailuresTest.java | 6 +- .../src/test/java/guides/RetryTest.java | 2 +- .../src/test/java/guides/RxTest.java | 16 +- .../java/guides/TransformItemsAsyncTest.java | 10 +- .../test/java/guides/TransformItemsTest.java | 2 +- .../java/guides/integration/ReactorTest.java | 4 +- .../java/guides/integration/RxJavaTest.java | 12 +- .../guides/operators/CollectingItemsTest.java | 14 +- .../guides/operators/CombiningItemsTest.java | 4 +- .../test/java/guides/operators/DelayTest.java | 6 +- .../java/guides/operators/EmitOnTest.java | 2 +- .../java/guides/operators/FilterTest.java | 20 +- .../guides/operators/MergeConcatTest.java | 4 +- .../guides/operators/RepetitionsTest.java | 4 +- .../test/java/guides/operators/TakeTest.java | 16 +- .../main/java/io/smallrye/mutiny/Multi.java | 58 +++++- .../smallrye/mutiny/groups/MultiCollect.java | 48 +++-- .../mutiny/groups/MultiGroupIntoLists.java | 21 ++- .../mutiny/operators/AbstractMulti.java | 19 +- .../mutiny/operators/MultiCollector.java | 93 ---------- .../io/smallrye/mutiny/MultiStageTest.java | 10 +- .../java/io/smallrye/mutiny/UniStageTest.java | 2 +- .../mutiny/groups/MultiConvertTest.java | 2 +- .../infrastructure/MutinySchedulerTest.java | 10 +- .../mutiny/operators/MultiCollectTest.java | 51 ++++-- .../mutiny/operators/MultiCombineTest.java | 74 ++++---- .../operators/MultiCreateFromItemsTest.java | 8 +- .../mutiny/operators/MultiFilterTest.java | 6 +- .../mutiny/operators/MultiGroupTest.java | 172 ++++++++++-------- .../mutiny/operators/MultiOnEventTest.java | 14 +- .../mutiny/operators/MultiSkipTest.java | 8 +- .../mutiny/operators/MultiTakeTest.java | 8 +- .../MultiTransformByMergingTest.java | 4 +- .../operators/MultiTransformToMultiTest.java | 26 +-- .../operators/MultiTransformToUniTest.java | 14 +- .../operators/UniOnItemDisjointTest.java | 22 +-- .../operators/UniOnNotNullItemTest.java | 12 +- .../mutiny/operators/UniRepeatTest.java | 34 ++-- .../mutiny/operators/UniToPublisherTest.java | 2 +- .../src/test/java/tck/MultiCollectTest.java | 20 +- .../src/test/java/tck/MultiConcatTckTest.java | 12 +- .../test/java/tck/MultiDistinctTckTest.java | 8 +- .../src/test/java/tck/MultiFirstTckTest.java | 12 +- .../MultiFlatMapCompletionStageTckTest.java | 14 +- .../test/java/tck/MultiFlatMapTckTest.java | 14 +- .../java/tck/MultiOnFailureResumeTest.java | 14 +- ...TransformToMultiAndConcatenateTckTest.java | 12 +- ...OnITemTransformToMultiAndMergeTckTest.java | 12 +- .../java/tck/MultiOnItemTransformTckTest.java | 8 +- .../java/tck/MultiSkipItemsWhileTckTest.java | 12 +- .../java/tck/MultiTakeFirstItemsTckTest.java | 12 +- .../java/tck/MultiTakeItemsWhileTckTest.java | 10 +- .../streams/stages/CollectStageFactory.java | 2 +- .../streams/stages/FindFirstStageFactory.java | 2 +- .../mutiny/converters/multi/ToSingle.java | 3 +- .../converters/multi/ToSingleFailOnNull.java | 2 +- 62 files changed, 520 insertions(+), 516 deletions(-) delete mode 100644 implementation/src/main/java/io/smallrye/mutiny/operators/MultiCollector.java diff --git a/context-propagation/src/test/java/io/smallrye/mutiny/context/MultiContextPropagationTest.java b/context-propagation/src/test/java/io/smallrye/mutiny/context/MultiContextPropagationTest.java index 8ee1f517d..fa143297e 100644 --- a/context-propagation/src/test/java/io/smallrye/mutiny/context/MultiContextPropagationTest.java +++ b/context-propagation/src/test/java/io/smallrye/mutiny/context/MultiContextPropagationTest.java @@ -125,7 +125,7 @@ public void testDeferredWithMultipleItems() { } catch (Throwable t) { emitter.fail(t); } - }).start()).collectItems().asList(); + }).start()).collect().asList(); List result = latch.await().indefinitely(); assertThat(result).hasSize(3).allSatisfy(i -> assertThat(i).isEqualTo(2)); @@ -151,7 +151,7 @@ public void testGenerator() { return r; }); - int result = multi.collectItems().first().await().indefinitely(); + int result = multi.collect().first().await().indefinitely(); assertThat(result).isEqualTo(2); } diff --git a/documentation/README.md b/documentation/README.md index bdec9e10a..b27aba3f4 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -96,14 +96,14 @@ public class RepetitionsTest { // tag::distinct[] List list = multi .transform().byDroppingDuplicates() - .collectItems().asList() + .collect().asList() .await().indefinitely(); // end::distinct[] // tag::repetition[] List list2 = multi .transform().byDroppingRepetitions() - .collectItems().asList() + .collect().asList() .await().indefinitely(); // end::repetition[] assertThat(list).containsExactly(1, 2, 3, 4, 5, 6); diff --git a/documentation/src/main/jekyll/assets/images/collect-as-list.png b/documentation/src/main/jekyll/assets/images/collect-as-list.png index 80665c831beab9404ca3676b79dc86e2cff7bfb7..263f19e82d4428768d634c51e85dfba45b996662 100644 GIT binary patch literal 36844 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 O(2MEnMX#rYrTz~TKI1R| literal 49832 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 YPr}MCc-PlT5a1&zD)+Na*dXZt0A}BDjQ{`u diff --git a/documentation/src/main/jekyll/guides/collecting-items.adoc b/documentation/src/main/jekyll/guides/collecting-items.adoc index 6f86188a3..a0d04c761 100644 --- a/documentation/src/main/jekyll/guides/collecting-items.adoc +++ b/documentation/src/main/jekyll/guides/collecting-items.adoc @@ -9,6 +9,7 @@ This is also called a _reduction_ in functional programming. The `Uni` fires its item when the `Multi` completes. Mutiny provides multiple operators to deal with that scenario. +They are available from the `collect()` group. For example, you can store the items in a list, emit the list on completion, or use a Java `Collector` to customize the aggregation. IMPORTANT: Don't collect items from infinite streams or you will likely end with an out-of-memory failure! @@ -78,7 +79,7 @@ include::{include_dir}/CollectingItemsTest.java[tag=collector] == Getting the first and last items -While they are not strictly speaking collecting items, the `collectItems().first()` and `collectItems().last()` allows retrieving the first and last item from a `Multi`: +While they are not strictly speaking collecting items, the `collect().first()` and `collect().last()` allows retrieving the first and last item from a `Multi`: [source, java, indent=0] ---- diff --git a/documentation/src/test/java/guides/CompletionStageTest.java b/documentation/src/test/java/guides/CompletionStageTest.java index 31957a096..27b0fd6ba 100644 --- a/documentation/src/test/java/guides/CompletionStageTest.java +++ b/documentation/src/test/java/guides/CompletionStageTest.java @@ -70,8 +70,8 @@ public void test() { .onItem().transform(String::toUpperCase); // end::create-multi[] - assertThat(multi1.collectItems().asList().await().indefinitely()).containsExactly("HELLO"); - assertThat(multi2.collectItems().asList().await().indefinitely()).containsExactly("HELLO"); + assertThat(multi1.collect().asList().await().indefinitely()).containsExactly("HELLO"); + assertThat(multi2.collect().asList().await().indefinitely()).containsExactly("HELLO"); } } diff --git a/documentation/src/test/java/guides/CreatingMultiTest.java b/documentation/src/test/java/guides/CreatingMultiTest.java index 7d39b16c9..d0a304703 100644 --- a/documentation/src/test/java/guides/CreatingMultiTest.java +++ b/documentation/src/test/java/guides/CreatingMultiTest.java @@ -54,8 +54,8 @@ public void creation() { Multi multiFromItems = Multi.createFrom().items(1, 2, 3, 4); Multi multiFromIterable = Multi.createFrom().iterable(Arrays.asList(1, 2, 3, 4, 5)); // end::simple[] - assertThat(multiFromItems.collectItems().asList().await().indefinitely()).containsExactly(1, 2, 3, 4); - assertThat(multiFromIterable.collectItems().asList().await().indefinitely()).containsExactly(1, 2, 3, 4, 5); + assertThat(multiFromItems.collect().asList().await().indefinitely()).containsExactly(1, 2, 3, 4); + assertThat(multiFromIterable.collect().asList().await().indefinitely()).containsExactly(1, 2, 3, 4, 5); } { @@ -64,9 +64,9 @@ public void creation() { Multi multi = Multi.createFrom().items(() -> IntStream.range(counter.getAndIncrement(), counter.get() * 2).boxed()); // end::supplier[] - assertThat(multi.collectItems().asList().await().indefinitely()).containsExactly(0, 1); - assertThat(multi.collectItems().asList().await().indefinitely()).containsExactly(1, 2, 3); - assertThat(multi.collectItems().asList().await().indefinitely()).containsExactly(2, 3, 4, 5); + assertThat(multi.collect().asList().await().indefinitely()).containsExactly(0, 1); + assertThat(multi.collect().asList().await().indefinitely()).containsExactly(1, 2, 3); + assertThat(multi.collect().asList().await().indefinitely()).containsExactly(2, 3, 4, 5); } { @@ -101,7 +101,7 @@ public void creation() { em.complete(); }); // end::emitter[] - assertThat(multi.collectItems().asList().await().indefinitely()).containsExactly(1, 2, 3); + assertThat(multi.collect().asList().await().indefinitely()).containsExactly(1, 2, 3); } { diff --git a/documentation/src/test/java/guides/HandlingFailuresTest.java b/documentation/src/test/java/guides/HandlingFailuresTest.java index 96f398293..0acc45b5d 100644 --- a/documentation/src/test/java/guides/HandlingFailuresTest.java +++ b/documentation/src/test/java/guides/HandlingFailuresTest.java @@ -26,7 +26,7 @@ public void testInvoke(SystemOut out) { .onFailure().invoke(failure -> log(failure)); // end::invoke[] assertThatThrownBy(() -> u.await().indefinitely()).hasMessageContaining("boom"); - assertThatThrownBy(() -> m.collectItems().asList() + assertThatThrownBy(() -> m.collect().asList() .await().indefinitely()).hasMessageContaining("boom"); assertThat(out.get()).contains("boom"); } @@ -64,7 +64,7 @@ public void testCompletionOnFailure() { Multi m = multi .onFailure().recoverWithCompletion(); // end::recover-completion[] - assertThat(m.collectItems().asList().await().indefinitely()).isEmpty(); + assertThat(m.collect().asList().await().indefinitely()).isEmpty(); } @Test @@ -79,7 +79,7 @@ public void testSwitch() { .onFailure().recoverWithMulti(f -> getFallbackMulti(f)); // end::recover-switch[] assertThat(u.await().indefinitely()).isEqualTo("hello"); - assertThat(m.collectItems().asList().await().indefinitely()).containsExactly("hey"); + assertThat(m.collect().asList().await().indefinitely()).containsExactly("hey"); } private Multi getFallbackMulti(Throwable f) { diff --git a/documentation/src/test/java/guides/RetryTest.java b/documentation/src/test/java/guides/RetryTest.java index 34a9435e7..73974a980 100644 --- a/documentation/src/test/java/guides/RetryTest.java +++ b/documentation/src/test/java/guides/RetryTest.java @@ -25,7 +25,7 @@ public void testRetryAtMost() { .onFailure().retry().atMost(3); // end::retry-at-most[] assertThatThrownBy(() -> u.await().indefinitely()).hasMessageContaining("boom"); - assertThatThrownBy(() -> m.collectItems().asList() + assertThatThrownBy(() -> m.collect().asList() .await().indefinitely()).hasMessageContaining("boom"); } diff --git a/documentation/src/test/java/guides/RxTest.java b/documentation/src/test/java/guides/RxTest.java index 4df05c13f..ba439fe5c 100644 --- a/documentation/src/test/java/guides/RxTest.java +++ b/documentation/src/test/java/guides/RxTest.java @@ -26,17 +26,17 @@ public void rx() { List list = multi .map(i -> i + 1) - .collectItems().asList() + .collect().asList() .await().indefinitely(); List list2 = multi .flatMap(i -> Multi.createFrom().items(i, i)) - .collectItems().asList() + .collect().asList() .await().indefinitely(); List list3 = multi .concatMap(i -> Multi.createFrom().items(i, i)) - .collectItems().asList() + .collect().asList() .await().indefinitely(); // end::rx[] @@ -68,31 +68,31 @@ public void mutiny() { List list = multi .onItem().transform(i -> i + 1) - .collectItems().asList() + .collect().asList() .await().indefinitely(); List list2 = multi .onItem().transformToMultiAndMerge(i -> Multi.createFrom().items(i, i)) - .collectItems().asList() + .collect().asList() .await().indefinitely(); // Equivalent to transformToMultiAndMerge but let you configure the flattening process, // failure management, concurrency... List list3 = multi .onItem().transformToMulti(i -> Multi.createFrom().items(i, i)).merge() - .collectItems().asList() + .collect().asList() .await().indefinitely(); List list4 = multi .onItem().transformToMultiAndConcatenate(i -> Multi.createFrom().items(i, i)) - .collectItems().asList() + .collect().asList() .await().indefinitely(); // Equivalent to transformToMultiAndConcatenate but let you configure the flattening process, // failure management... List list5 = multi .onItem().transformToMulti(i -> Multi.createFrom().items(i, i)).concatenate() - .collectItems().asList() + .collect().asList() .await().indefinitely(); diff --git a/documentation/src/test/java/guides/TransformItemsAsyncTest.java b/documentation/src/test/java/guides/TransformItemsAsyncTest.java index 48f504569..0ddfcb068 100644 --- a/documentation/src/test/java/guides/TransformItemsAsyncTest.java +++ b/documentation/src/test/java/guides/TransformItemsAsyncTest.java @@ -67,7 +67,7 @@ public void testUniToMulti(SystemOut out) { Multi result = uni .onItem().transformToMulti(item -> Multi.createFrom().items(item, item)); // end::uni-to-multi[] - assertThat(result.collectItems().asList().await().indefinitely()).containsExactly("Cameron", "Cameron"); + assertThat(result.collect().asList().await().indefinitely()).containsExactly("Cameron", "Cameron"); // tag::uni-to-multi-2[] uni @@ -90,8 +90,8 @@ public void testMergeAndConcatUni() { .onItem().transformToUniAndConcatenate(name -> invokeRemoteGreetingService(name)); // end::merge-concat[] - assertThat(merged.collectItems().asList().await().indefinitely()).containsExactly("a", "b"); - assertThat(concat.collectItems().asList().await().indefinitely()).containsExactly("a", "b"); + assertThat(merged.collect().asList().await().indefinitely()).containsExactly("a", "b"); + assertThat(concat.collect().asList().await().indefinitely()).containsExactly("a", "b"); } @Test @@ -106,8 +106,8 @@ public void testMergeAndConcatMulti() { .onItem().transformToMultiAndConcatenate(item -> someMulti(item)); // end::merge-concat-multi[] - assertThat(merged.collectItems().asList().await().indefinitely()).containsExactly("a", "b"); - assertThat(concat.collectItems().asList().await().indefinitely()).containsExactly("a", "b"); + assertThat(merged.collect().asList().await().indefinitely()).containsExactly("a", "b"); + assertThat(concat.collect().asList().await().indefinitely()).containsExactly("a", "b"); } private Multi someMulti(String item) { diff --git a/documentation/src/test/java/guides/TransformItemsTest.java b/documentation/src/test/java/guides/TransformItemsTest.java index fdcdfc44e..783f0eea3 100644 --- a/documentation/src/test/java/guides/TransformItemsTest.java +++ b/documentation/src/test/java/guides/TransformItemsTest.java @@ -32,7 +32,7 @@ public void testMultiTransform() { Multi m = multi .onItem().transform(i -> i.toUpperCase()); // end::multi-transform[] - assertThat(m.collectItems().asList().await().indefinitely()).containsExactly("A", "B", "C"); + assertThat(m.collect().asList().await().indefinitely()).containsExactly("A", "B", "C"); } @Test diff --git a/documentation/src/test/java/guides/integration/ReactorTest.java b/documentation/src/test/java/guides/integration/ReactorTest.java index 381372e26..30d3f42e1 100644 --- a/documentation/src/test/java/guides/integration/ReactorTest.java +++ b/documentation/src/test/java/guides/integration/ReactorTest.java @@ -27,12 +27,12 @@ public void testMultiCreation() { List list = multiFromFlux .onItem().transform(Object::toString) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly("a", "b", "c"); list = multiFromMono .onItem().transform(Object::toString) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly("a"); } diff --git a/documentation/src/test/java/guides/integration/RxJavaTest.java b/documentation/src/test/java/guides/integration/RxJavaTest.java index 0acc59301..3445740ce 100644 --- a/documentation/src/test/java/guides/integration/RxJavaTest.java +++ b/documentation/src/test/java/guides/integration/RxJavaTest.java @@ -33,12 +33,12 @@ public void testMultiCreation() { List list = multiFromObservable .onItem().transform(Object::toString) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly("a", "b", "c"); list = multiFromFlowable .onItem().transform(Object::toString) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly("a", "b", "c"); Completable completable = getCompletable(); @@ -59,22 +59,22 @@ public void testMultiCreation() { list = multiFromCompletable .onItem().transform(Object::toString) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).isEmpty(); list = multiFromSingle .onItem().transform(Object::toString) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly("a"); list = multiFromMaybe .onItem().transform(Object::toString) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly("a"); list = multiFromEmptyMaybe .onItem().transform(Object::toString) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).isEmpty(); } diff --git a/documentation/src/test/java/guides/operators/CollectingItemsTest.java b/documentation/src/test/java/guides/operators/CollectingItemsTest.java index b407d9f68..b48d62c53 100644 --- a/documentation/src/test/java/guides/operators/CollectingItemsTest.java +++ b/documentation/src/test/java/guides/operators/CollectingItemsTest.java @@ -21,14 +21,14 @@ public class CollectingItemsTest { public void testList() { // tag::list[] Multi multi = getMulti(); - Uni> uni = multi.collectItems().asList(); + Uni> uni = multi.collect().asList(); // end::list[] assertThat(uni.await().indefinitely()).containsExactly("a", "b", "c"); // tag::first[] - Uni first = multi.collectItems().first(); - Uni last = multi.collectItems().last(); + Uni first = multi.collect().first(); + Uni last = multi.collect().last(); // end::first[] assertThat(first.await().indefinitely()).isEqualTo("a"); @@ -40,7 +40,7 @@ public void testMap() { // tag::map[] Multi multi = getMulti(); Uni> uni = - multi.collectItems() + multi.collect() .asMap(item -> getUniqueKeyForItem(item)); // end::map[] @@ -52,7 +52,7 @@ public void testMultiMap() { // tag::multimap[] Multi multi = getMulti(); Uni>> uni = - multi.collectItems() + multi.collect() .asMultiMap(item -> getKeyForItem(item)); // end::multimap[] @@ -63,14 +63,14 @@ public void testMultiMap() { public void testCustomAccumulator() { // tag::accumulator[] Multi multi = getMulti(); - Uni uni = multi.collectItems() + Uni uni = multi.collect() .in(MyCollection::new, (col, item) -> col.add(item)); // end::accumulator[] assertThat(uni.await().indefinitely()).hasSize(3); // tag::collector[] - Uni count = multi.collectItems() + Uni count = multi.collect() .with(Collectors.counting()); // end::collector[] diff --git a/documentation/src/test/java/guides/operators/CombiningItemsTest.java b/documentation/src/test/java/guides/operators/CombiningItemsTest.java index eee04c3f8..caa07fd56 100644 --- a/documentation/src/test/java/guides/operators/CombiningItemsTest.java +++ b/documentation/src/test/java/guides/operators/CombiningItemsTest.java @@ -113,10 +113,10 @@ public void testCombineLast() { .latestItems().using(list -> combineItems(list)); // end::combine-last[] - List> list = multi1.collectItems().asList().await().indefinitely(); + List> list = multi1.collect().asList().await().indefinitely(); assertThat(list).hasSize(3); assertThat(list.toString()).contains("a3", "b1", "b2", "b3").doesNotContain("a1", "a2"); - List strings = multi2.collectItems().asList().await().indefinitely(); + List strings = multi2.collect().asList().await().indefinitely(); assertThat(strings).hasSize(3).containsExactly("a3b1", "a3b2", "a3b3"); } diff --git a/documentation/src/test/java/guides/operators/DelayTest.java b/documentation/src/test/java/guides/operators/DelayTest.java index 043e9266d..052004e8b 100644 --- a/documentation/src/test/java/guides/operators/DelayTest.java +++ b/documentation/src/test/java/guides/operators/DelayTest.java @@ -47,7 +47,7 @@ public void testDelayMulti() { Uni.createFrom().nullItem().onItem().delayIt().by(Duration.ofMillis(10)) ); // end::delay-multi[] - assertThat(delayed.collectItems().asList().await().indefinitely()).containsExactly(1, 2, 3, 4, 5); + assertThat(delayed.collect().asList().await().indefinitely()).containsExactly(1, 2, 3, 4, 5); } @Test @@ -60,7 +60,7 @@ public void testThrottling() { Multi delayed = Multi.createBy().combining().streams(ticks, multi) .using((x, item) -> item); // end::throttling-multi[] - assertThat(delayed.collectItems().asList().await().indefinitely()).containsExactly(1, 2, 3, 4, 5); + assertThat(delayed.collect().asList().await().indefinitely()).containsExactly(1, 2, 3, 4, 5); } @Test @@ -73,7 +73,7 @@ public void testDelayMultiRandom() { return Uni.createFrom().nullItem().onItem().delayIt().by(delay); }); // end::delay-multi-random[] - assertThat(delayed.collectItems().asList() + assertThat(delayed.collect().asList() .await().indefinitely()) .containsExactlyInAnyOrder(1, 2, 3, 4, 5); } diff --git a/documentation/src/test/java/guides/operators/EmitOnTest.java b/documentation/src/test/java/guides/operators/EmitOnTest.java index a4c3be909..c9398aa36 100644 --- a/documentation/src/test/java/guides/operators/EmitOnTest.java +++ b/documentation/src/test/java/guides/operators/EmitOnTest.java @@ -51,7 +51,7 @@ public void test(SystemOut out) { .onItem() .invoke(s -> System.out.println("Received item `" + s + "` on thread: " + Thread.currentThread().getName())) - .collectItems().first() + .collect().first() .await().indefinitely(); // end::code[] diff --git a/documentation/src/test/java/guides/operators/FilterTest.java b/documentation/src/test/java/guides/operators/FilterTest.java index 43b2b28ee..611e7807c 100644 --- a/documentation/src/test/java/guides/operators/FilterTest.java +++ b/documentation/src/test/java/guides/operators/FilterTest.java @@ -16,14 +16,14 @@ public void filter() { // tag::filter[] List list = multi .transform().byFilteringItemsWith(i -> i > 6) - .collectItems().asList() + .collect().asList() .await().indefinitely(); // end::filter[] // tag::test[] List list2 = multi .transform().byTestingItemsWith(i -> Uni.createFrom().item(i > 6)) - .collectItems().asList() + .collect().asList() .await().indefinitely(); // end::test[] @@ -37,17 +37,17 @@ public void take() { // tag::take[] List list = multi .transform().byTakingFirstItems(2) - .collectItems().asList() + .collect().asList() .await().indefinitely(); List list2 = multi .transform().byTakingItemsWhile(i -> i < 3) - .collectItems().asList() + .collect().asList() .await().indefinitely(); List list3 = multi .transform().byTakingLastItems(2) - .collectItems().asList() + .collect().asList() .await().indefinitely(); // end::take[] assertThat(list).containsExactly(1, 2); @@ -61,17 +61,17 @@ public void skip() { // tag::skip[] List list = multi .transform().bySkippingFirstItems(8) - .collectItems().asList() + .collect().asList() .await().indefinitely(); List list2 = multi .transform().bySkippingItemsWhile(i -> i < 9) - .collectItems().asList() + .collect().asList() .await().indefinitely(); List list3 = multi .transform().bySkippingLastItems(8) - .collectItems().asList() + .collect().asList() .await().indefinitely(); // end::skip[] assertThat(list).containsExactly(9, 10); @@ -85,14 +85,14 @@ public void distinct() { // tag::distinct[] List list = multi .transform().byDroppingDuplicates() - .collectItems().asList() + .collect().asList() .await().indefinitely(); // end::distinct[] // tag::repetition[] List list2 = multi .transform().byDroppingRepetitions() - .collectItems().asList() + .collect().asList() .await().indefinitely(); // end::repetition[] assertThat(list).containsExactly(1, 2, 3, 4, 5, 6); diff --git a/documentation/src/test/java/guides/operators/MergeConcatTest.java b/documentation/src/test/java/guides/operators/MergeConcatTest.java index 2905098e6..580404e7e 100644 --- a/documentation/src/test/java/guides/operators/MergeConcatTest.java +++ b/documentation/src/test/java/guides/operators/MergeConcatTest.java @@ -91,13 +91,13 @@ public void testConcatenateStrings(SystemOut out) { assertThat( Multi.createBy().concatenating().streams(first, second) - .collectItems().in(StringBuffer::new, StringBuffer::append) + .collect().in(StringBuffer::new, StringBuffer::append) .await().indefinitely() ).isEqualToIgnoringCase("A1A2A3B1B2B3"); assertThat( Multi.createBy().concatenating().streams(second, first) - .collectItems().in(StringBuffer::new, StringBuffer::append) + .collect().in(StringBuffer::new, StringBuffer::append) .await().indefinitely() ).isEqualToIgnoringCase("B1B2B3A1A2A3"); diff --git a/documentation/src/test/java/guides/operators/RepetitionsTest.java b/documentation/src/test/java/guides/operators/RepetitionsTest.java index b337943aa..e35a5fcf3 100644 --- a/documentation/src/test/java/guides/operators/RepetitionsTest.java +++ b/documentation/src/test/java/guides/operators/RepetitionsTest.java @@ -15,14 +15,14 @@ public void distinct() { // tag::distinct[] List list = multi .transform().byDroppingDuplicates() - .collectItems().asList() + .collect().asList() .await().indefinitely(); // end::distinct[] // tag::repetition[] List list2 = multi .transform().byDroppingRepetitions() - .collectItems().asList() + .collect().asList() .await().indefinitely(); // end::repetition[] assertThat(list).containsExactly(1, 2, 3, 4, 5, 6); diff --git a/documentation/src/test/java/guides/operators/TakeTest.java b/documentation/src/test/java/guides/operators/TakeTest.java index 1757e3597..ff210fad4 100644 --- a/documentation/src/test/java/guides/operators/TakeTest.java +++ b/documentation/src/test/java/guides/operators/TakeTest.java @@ -29,10 +29,10 @@ public void testTake() { Multi takeForDuration = multi.transform().byTakingItemsFor(Duration.ofSeconds(1)); // end::take-for[] - assertThat(firstThreeItems.collectItems().asList().await().indefinitely()).containsExactly(1, 2, 3); - assertThat(takeWhile.collectItems().asList().await().indefinitely()).containsExactly(1, 2, 3); - assertThat(lastThreeItems.collectItems().asList().await().indefinitely()).containsExactly(7, 8, 9); - assertThat(takeForDuration.collectItems().asList().await().indefinitely()).containsExactly(1, 2, 3, 4, 5, 6, 7, 8, 9); + assertThat(firstThreeItems.collect().asList().await().indefinitely()).containsExactly(1, 2, 3); + assertThat(takeWhile.collect().asList().await().indefinitely()).containsExactly(1, 2, 3); + assertThat(lastThreeItems.collect().asList().await().indefinitely()).containsExactly(7, 8, 9); + assertThat(takeForDuration.collect().asList().await().indefinitely()).containsExactly(1, 2, 3, 4, 5, 6, 7, 8, 9); } @@ -56,10 +56,10 @@ public void testSkip() { Multi skipForDuration = multi.transform().bySkippingItemsFor(Duration.ofSeconds(1)); // end::skip-for[] - assertThat(skipThreeItems.collectItems().asList().await().indefinitely()).containsExactly(4, 5, 6, 7, 8, 9); - assertThat(skipLastThreeItems.collectItems().asList().await().indefinitely()).containsExactly(1, 2, 3, 4 ,5, 6); - assertThat(skipWhile.collectItems().asList().await().indefinitely()).containsExactly(4, 5, 6, 7, 8, 9); - assertThat(skipForDuration.collectItems().asList().await().indefinitely()).isEmpty(); + assertThat(skipThreeItems.collect().asList().await().indefinitely()).containsExactly(4, 5, 6, 7, 8, 9); + assertThat(skipLastThreeItems.collect().asList().await().indefinitely()).containsExactly(1, 2, 3, 4 ,5, 6); + assertThat(skipWhile.collect().asList().await().indefinitely()).containsExactly(4, 5, 6, 7, 8, 9); + assertThat(skipForDuration.collect().asList().await().indefinitely()).isEmpty(); } } diff --git a/implementation/src/main/java/io/smallrye/mutiny/Multi.java b/implementation/src/main/java/io/smallrye/mutiny/Multi.java index 5f72495e1..cfceffdf8 100644 --- a/implementation/src/main/java/io/smallrye/mutiny/Multi.java +++ b/implementation/src/main/java/io/smallrye/mutiny/Multi.java @@ -140,7 +140,7 @@ default O stage(Function, O> stage) { /** * Configures the action to execute when the observed {@link Multi} sends a {@link Subscription}. * The downstream don't have a subscription yet. It will be passed once the configured action completes. - * + *

* For example: * *

@@ -190,15 +190,42 @@ default  O stage(Function, O> stage) {
     Multi cache();
 
     /**
-     * Produces {@link Multi} or {@link Uni} collecting items from this {@link Multi}. You can accumulate the items
-     * into a {@link java.util.List} ({@link MultiCollect#asList()}), {@link java.util.Map}
-     * ({@link MultiCollect#asMap(Function)}...
+     * Produces {@link Uni} collecting/aggregating items from this {@link Multi}.
+     * It allows accumulating the items emitted by this {@code multi} into a structure such as a into a
+     * {@link java.util.List} ({@link MultiCollect#asList()}), a {@link java.util.Map}
+     * ({@link MultiCollect#asMap(Function)}, or a custom collector.
+     * When this {@code multi} sends the completion signal, the structure is emitted by the returned {@link Uni}.
+     * 

+ * If this {@link Multi} emits a failure, the produced {@link Uni} produces the same failure and the aggregated items + * are discarded. + *

+ * You can also retrieve the first and last items using {@link MultiCollect#first()} and {@link MultiCollect#last()}. + * Be aware to not used method collecting items on unbounded / infinite {@link Multi}. + * + * @return the object to configure the collection process. + * @deprecated Use {@link #collect()} instead + */ + @Deprecated + default MultiCollect collectItems() { + return collect(); + } + + /** + * Produces {@link Uni} collecting/aggregating items from this {@link Multi}. + * It allows accumulating the items emitted by this {@code multi} into a structure such as a into a + * {@link java.util.List} ({@link MultiCollect#asList()}), a {@link java.util.Map} + * ({@link MultiCollect#asMap(Function)}, or a custom collector. + * When this {@code multi} sends the completion signal, the structure is emitted by the returned {@link Uni}. + *

+ * If this {@link Multi} emits a failure, the produced {@link Uni} produces the same failure and the aggregated items + * are discarded. *

- * You can also retrieve the first and list items using {@link MultiCollect#first()} and {@link MultiCollect#last()}. + * You can also retrieve the first and last items using {@link MultiCollect#first()} and {@link MultiCollect#last()}. + * Be aware to not used method collecting items on unbounded / infinite {@link Multi}. * * @return the object to configure the collection process. */ - MultiCollect collectItems(); + MultiCollect collect(); /** * Produces {@link Multi} grouping items from this {@link Multi} into various "form of chunks" (list, {@link Multi}). @@ -207,7 +234,20 @@ default O stage(Function, O> stage) { * * @return the object to configure the grouping. */ - MultiGroup groupItems(); + MultiGroup group(); + + /** + * Produces {@link Multi} grouping items from this {@link Multi} into various "form of chunks" (list, {@link Multi}). + * The grouping can be done linearly ({@link MultiGroup#intoLists()} and {@link MultiGroup#intoMultis()}, or based + * on a grouping function ({@link MultiGroup#by(Function)}) + * + * @return the object to configure the grouping. + * @deprecated Use {@link #group()} instead + */ + @Deprecated + default MultiGroup groupItems() { + return group(); + } /** * Produces a new {@link Multi} invoking the {@code onItem}, {@code onFailure} and {@code onCompletion} methods @@ -464,14 +504,14 @@ default Multi concatMap(Function onTermination(); /** * Configures actions when the subscriber cancels the subscription. - * + * * @return the object to configure the cancellation actions */ MultiOnCancel onCancellation(); diff --git a/implementation/src/main/java/io/smallrye/mutiny/groups/MultiCollect.java b/implementation/src/main/java/io/smallrye/mutiny/groups/MultiCollect.java index aacf72d51..9b211e43c 100644 --- a/implementation/src/main/java/io/smallrye/mutiny/groups/MultiCollect.java +++ b/implementation/src/main/java/io/smallrye/mutiny/groups/MultiCollect.java @@ -2,6 +2,7 @@ import static io.smallrye.mutiny.helpers.ParameterValidation.nonNull; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -9,10 +10,13 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; +import java.util.stream.Collectors; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; -import io.smallrye.mutiny.operators.MultiCollector; +import io.smallrye.mutiny.infrastructure.Infrastructure; +import io.smallrye.mutiny.operators.multi.MultiCollectorOp; +import io.smallrye.mutiny.operators.multi.MultiLastItemOp; /** * Collects / aggregates items from the upstream and send the resulting collection / structure when the @@ -39,7 +43,7 @@ public MultiCollect(Multi upstream) { * @return the produced uni */ public Uni first() { - return MultiCollector.first(upstream); + return Uni.createFrom().multi(upstream); } /** @@ -53,7 +57,7 @@ public Uni first() { * @return the produced uni */ public Uni last() { - return MultiCollector.last(upstream); + return Uni.createFrom().publisher(Infrastructure.onMultiCreation(new MultiLastItemOp<>(upstream))); } /** @@ -63,7 +67,7 @@ public Uni last() { * @return the {@link Uni} emitting the list of items from this {@link Multi}. */ public Uni> asList() { - return MultiCollector.list(upstream); + return collector(upstream, Collectors.toList(), false); } /** @@ -76,7 +80,7 @@ public Uni> asList() { * @return a {@link Uni} emitted the collected object as item, when the {@link Multi} completes */ public Uni with(Collector collector) { - return MultiCollector.collector(upstream, collector, true); + return collector(upstream, collector, true); } /** @@ -99,7 +103,9 @@ public Uni with(Collector collector) { * @return a {@link Uni} emitting the collected container as item when this {@link Multi} completes */ public Uni in(Supplier supplier, BiConsumer accumulator) { - return MultiCollector.collectInto(upstream, supplier, accumulator); + Collector collector = Collector.of(supplier, accumulator, (r, r2) -> r, + Collector.Characteristics.IDENTITY_FINISH); + return collector(upstream, collector, false); } /** @@ -138,9 +144,10 @@ public Uni> asMap(Function keyMapper) { * @return a {@link Uni} emitting an item with the collected {@link Map}. The uni emits the item when this * {@link Multi} completes */ - public Uni> asMap(Function keyMapper, + public Uni> asMap( + Function keyMapper, Function valueMapper) { - return MultiCollector.map(upstream, keyMapper, valueMapper); + return collector(upstream, Collectors.toMap(keyMapper, valueMapper), false); } /** @@ -161,9 +168,21 @@ public Uni> asMap(Function keyMapper, * @return a {@link Uni} emitting an item with the collected {@link Map}. The uni emits the item when this * {@link Multi} completes */ - public Uni>> asMultiMap(Function keyMapper, + public Uni>> asMultiMap( + Function keyMapper, Function valueMapper) { - return MultiCollector.multimap(upstream, keyMapper, valueMapper); + return collector(upstream, Collectors.toMap( + keyMapper, + res -> { + List list = new ArrayList<>(); + V mapped = valueMapper.apply(res); + list.add(mapped); + return list; + }, + (vs, vs2) -> { + vs.addAll(vs2); + return vs; + }), false); } /** @@ -181,7 +200,14 @@ public Uni>> asMultiMap(Function Uni>> asMultiMap(Function keyMapper) { - return MultiCollector.multimap(upstream, keyMapper, Function.identity()); + return asMultiMap(keyMapper, Function.identity()); + } + + private static Uni collector(Multi upstream, Collector collector, + boolean acceptNullAsInitialValue) { + Multi multi = Infrastructure + .onMultiCreation(new MultiCollectorOp<>(upstream, collector, acceptNullAsInitialValue)); + return Uni.createFrom().publisher(multi); } } diff --git a/implementation/src/main/java/io/smallrye/mutiny/groups/MultiGroupIntoLists.java b/implementation/src/main/java/io/smallrye/mutiny/groups/MultiGroupIntoLists.java index d575c7468..0274c3d0e 100644 --- a/implementation/src/main/java/io/smallrye/mutiny/groups/MultiGroupIntoLists.java +++ b/implementation/src/main/java/io/smallrye/mutiny/groups/MultiGroupIntoLists.java @@ -1,15 +1,14 @@ package io.smallrye.mutiny.groups; -import static io.smallrye.mutiny.helpers.ParameterValidation.nonNull; -import static io.smallrye.mutiny.helpers.ParameterValidation.positive; -import static io.smallrye.mutiny.helpers.ParameterValidation.validate; +import static io.smallrye.mutiny.helpers.ParameterValidation.*; import java.time.Duration; import java.util.List; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.infrastructure.Infrastructure; -import io.smallrye.mutiny.operators.MultiCollector; +import io.smallrye.mutiny.operators.multi.MultiBufferOp; +import io.smallrye.mutiny.operators.multi.MultiBufferWithTimeoutOp; public class MultiGroupIntoLists { @@ -37,7 +36,9 @@ public MultiGroupIntoLists(Multi upstream) { * window. */ public Multi> every(Duration duration) { - return Infrastructure.onMultiCreation(MultiCollector.list(upstream, validate(duration, "duration"))); + return Infrastructure.onMultiCreation(new MultiBufferWithTimeoutOp<>(upstream, Integer.MAX_VALUE, + validate(duration, "duration"), + Infrastructure.getDefaultWorkerPool())); } /** @@ -55,7 +56,7 @@ public Multi> every(Duration duration) { * @return a Multi emitting lists of at most {@code size} items from the upstream Multi. */ public Multi> of(int size) { - return Infrastructure.onMultiCreation(MultiCollector.list(upstream, positive(size, "size"))); + return Infrastructure.onMultiCreation(new MultiBufferOp<>(upstream, size, size)); } /** @@ -76,8 +77,8 @@ public Multi> of(int size) { * {@code size} items */ public Multi> of(int size, int skip) { - return Infrastructure.onMultiCreation( - MultiCollector.list(upstream, positive(size, "size"), positive(skip, "skip"))); + return Infrastructure.onMultiCreation(new MultiBufferOp<>(upstream, + positive(size, "size"), positive(skip, "skip"))); } /** @@ -101,7 +102,7 @@ public Multi> of(int size, int skip) { * @return a Multi emitting lists of at most {@code size} items from the upstream Multi. */ public Multi> of(int size, Duration maximumDelay) { - return upstream.groupItems().intoMultis().every(maximumDelay) - .flatMap(withTimeout -> withTimeout.groupItems().intoLists().of(size)); + return upstream.group().intoMultis().every(maximumDelay) + .flatMap(withTimeout -> withTimeout.group().intoLists().of(size)); } } diff --git a/implementation/src/main/java/io/smallrye/mutiny/operators/AbstractMulti.java b/implementation/src/main/java/io/smallrye/mutiny/operators/AbstractMulti.java index 3330cf38d..dbbcadf28 100644 --- a/implementation/src/main/java/io/smallrye/mutiny/operators/AbstractMulti.java +++ b/implementation/src/main/java/io/smallrye/mutiny/operators/AbstractMulti.java @@ -71,16 +71,6 @@ public Multi cache() { return Infrastructure.onMultiCreation(new MultiCacheOp<>(this)); } - @Override - public MultiCollect collectItems() { - return new MultiCollect<>(this); - } - - @Override - public MultiGroup groupItems() { - return new MultiGroup<>(this); - } - @Override public Multi emitOn(Executor executor) { return Infrastructure.onMultiCreation(new MultiEmitOnOp<>(this, nonNull(executor, "executor"))); @@ -136,4 +126,13 @@ public MultiOnRequest onRequest() { return new MultiOnRequest<>(this); } + @Override + public MultiCollect collect() { + return new MultiCollect<>(this); + } + + @Override + public MultiGroup group() { + return new MultiGroup<>(this); + } } diff --git a/implementation/src/main/java/io/smallrye/mutiny/operators/MultiCollector.java b/implementation/src/main/java/io/smallrye/mutiny/operators/MultiCollector.java deleted file mode 100644 index 20c44a5c2..000000000 --- a/implementation/src/main/java/io/smallrye/mutiny/operators/MultiCollector.java +++ /dev/null @@ -1,93 +0,0 @@ -package io.smallrye.mutiny.operators; - -import java.time.Duration; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collector; -import java.util.stream.Collectors; - -import io.smallrye.mutiny.Multi; -import io.smallrye.mutiny.Uni; -import io.smallrye.mutiny.infrastructure.Infrastructure; -import io.smallrye.mutiny.operators.multi.MultiBufferOp; -import io.smallrye.mutiny.operators.multi.MultiBufferWithTimeoutOp; -import io.smallrye.mutiny.operators.multi.MultiCollectorOp; -import io.smallrye.mutiny.operators.multi.MultiLastItemOp; - -public class MultiCollector { - - private MultiCollector() { - // avoid direct instantiation. - } - - public static Uni first(Multi upstream) { - return Uni.createFrom().multi(upstream); - } - - public static Uni last(Multi upstream) { - return Uni.createFrom().publisher(Infrastructure.onMultiCreation(new MultiLastItemOp<>(upstream))); - } - - public static Uni> list(Multi upstream) { - return collector(upstream, Collectors.toList(), false); - } - - public static Uni collector(Multi upstream, Collector collector, - boolean acceptNullAsInitialValue) { - Multi multi = Infrastructure.onMultiCreation(new MultiCollectorOp<>(upstream, collector, acceptNullAsInitialValue)); - return Uni.createFrom().publisher(multi); - } - - public static Uni collectInto(Multi upstream, Supplier producer, - BiConsumer combinator) { - Collector collector = Collector.of(producer, combinator, (BinaryOperator) (r, r2) -> r, - Collector.Characteristics.IDENTITY_FINISH); - return collector(upstream, collector, false); - } - - public static Uni> map(Multi upstream, Function keyMapper) { - return map(upstream, keyMapper, Function.identity()); - } - - public static Uni> map(Multi upstream, Function keyMapper, - Function valueMapper) { - return collector(upstream, Collectors.toMap(keyMapper, valueMapper), false); - } - - public static Uni>> multimap(Multi upstream, - Function keyMapper, - Function valueMapper) { - return collector(upstream, Collectors.toMap( - keyMapper, - res -> { - List list = new ArrayList<>(); - V mapped = valueMapper.apply(res); - list.add(mapped); - return list; - }, - (vs, vs2) -> { - vs.addAll(vs2); - return vs; - }), false); - } - - public static Multi> list(Multi upstream, Duration timeWindow) { - return Infrastructure.onMultiCreation(new MultiBufferWithTimeoutOp<>(upstream, Integer.MAX_VALUE, timeWindow, - Infrastructure.getDefaultWorkerPool())); - } - - public static Multi> list(Multi upstream, int size) { - return Infrastructure.onMultiCreation(new MultiBufferOp<>(upstream, size, size)); - } - - public static Multi> list(Multi upstream, int size, int skip) { - return Infrastructure.onMultiCreation(new MultiBufferOp<>(upstream, size, skip)); - } - -} diff --git a/implementation/src/test/java/io/smallrye/mutiny/MultiStageTest.java b/implementation/src/test/java/io/smallrye/mutiny/MultiStageTest.java index d2f2c0076..3f6d5eb35 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/MultiStageTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/MultiStageTest.java @@ -21,7 +21,7 @@ public void testChainStage() { .onItem().transform(i -> i + 1) .onFailure().retry().indefinitely()) .stage(m -> m.onItem().transform(i -> Integer.toString(i))) - .stage(m -> m.collectItems().asList()) + .stage(m -> m.collect().asList()) .await().indefinitely(); assertThat(result).containsExactly("2", "3", "4"); } @@ -37,7 +37,7 @@ public void testChainWithDeprecatedThenAndApply() { .onItem().apply(i -> i + 1) .onFailure().retry().indefinitely()) .then(m -> m.onItem().apply(i -> Integer.toString(i))) - .then(m -> m.collectItems().asList()) + .then(m -> m.collect().asList()) .await().indefinitely(); assertThat(result).containsExactly("2", "3", "4"); } @@ -66,7 +66,7 @@ public void testThatFunctionCanReturnNullIfVoid() { .stage(self -> self.onItem().transformToUni(i -> Uni.createFrom().item(Integer.toString(i))) .concatenate()) .stage(self -> { - String r = self.collectItems().first().await().indefinitely(); + String r = self.collect().first().await().indefinitely(); result.set(r); return null; // void }); @@ -80,7 +80,7 @@ public void testChainingUni() { .stage(self -> self .onItem().transform(i -> i + 1) .onItem().transform(i -> Integer.toString(i))) - .stage(self -> self.collectItems().first()) + .stage(self -> self.collect().first()) .stage(self -> self.await().indefinitely()); assertThat(result).isEqualTo("24"); } @@ -91,7 +91,7 @@ public void testChainingUniWithDeprecatedApplyAndThen() { .then(self -> self .onItem().apply(i -> i + 1) .onItem().apply(i -> Integer.toString(i))) - .then(self -> self.collectItems().first()) + .then(self -> self.collect().first()) .then(self -> self.await().indefinitely()); assertThat(result).isEqualTo("24"); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/UniStageTest.java b/implementation/src/test/java/io/smallrye/mutiny/UniStageTest.java index 4169afade..1a711800f 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/UniStageTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/UniStageTest.java @@ -71,7 +71,7 @@ public void testChainingMulti() { .stage(self -> self .onItem().transform(i -> i + 1) .onItem().transform(i -> Integer.toString(i))) - .stage(self -> self.collectItems().first()) + .stage(self -> self.collect().first()) .stage(self -> self.await().indefinitely()); assertThat(result).isEqualTo("24"); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/groups/MultiConvertTest.java b/implementation/src/test/java/io/smallrye/mutiny/groups/MultiConvertTest.java index a9a7da425..a9f362898 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/groups/MultiConvertTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/groups/MultiConvertTest.java @@ -15,7 +15,7 @@ public class MultiConvertTest { @Test public void testMultiConvertWithCustomConverter() { Multi multi = Multi.createFrom().items(1, 2, 3).convert().with(m -> m.map(i -> Integer.toString(i))); - List list = multi.collectItems().asList().await().indefinitely(); + List list = multi.collect().asList().await().indefinitely(); assertThat(list).containsExactly("1", "2", "3"); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/infrastructure/MutinySchedulerTest.java b/implementation/src/test/java/io/smallrye/mutiny/infrastructure/MutinySchedulerTest.java index f2123e17e..1a68a536a 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/infrastructure/MutinySchedulerTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/infrastructure/MutinySchedulerTest.java @@ -104,7 +104,7 @@ public void testMultiRetry() { thread.set(Thread.currentThread().getName()); return s.toUpperCase(); }) - .collectItems().first() + .collect().first() .await().indefinitely(); assertThat(res).isEqualTo("HELLO"); @@ -128,7 +128,7 @@ public void testMultiRetryExpireIn() { thread.set(Thread.currentThread().getName()); return s.toUpperCase(); }) - .collectItems().first() + .collect().first() .await().indefinitely(); assertThat(res).isEqualTo("HELLO"); @@ -140,7 +140,7 @@ public void testTicks() { AtomicReference thread = new AtomicReference<>(); List list = Multi.createFrom().ticks().every(Duration.ofMillis(10)) .transform().byTakingFirstItems(5) - .collectItems().asList() + .collect().asList() .onItem().invoke(l -> thread.set(Thread.currentThread().getName())) .await().indefinitely(); @@ -152,9 +152,9 @@ public void testTicks() { public void testCollectionBasedOnDuration() { AtomicReference thread = new AtomicReference<>(); Multi.createFrom().ticks().every(Duration.ofMillis(10)) - .groupItems().intoLists().every(Duration.ofMillis(10)) + .group().intoLists().every(Duration.ofMillis(10)) .transform().byTakingFirstItems(5) - .collectItems().asList() + .collect().asList() .onItem().invoke(l -> thread.set(Thread.currentThread().getName())) .await().indefinitely(); assertThat(thread.get()).startsWith("my-thread-"); diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCollectTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCollectTest.java index 734cc142c..5187b0383 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCollectTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCollectTest.java @@ -34,6 +34,23 @@ public class MultiCollectTest { @Test public void testCollectFirstAndLast() { + Multi items = Multi.createFrom().items(1, 2, 3); + items + .collect().first() + .subscribe().withSubscriber(UniAssertSubscriber.create()) + .await() + .assertItem(1); + + items + .collect().last() + .subscribe().withSubscriber(UniAssertSubscriber.create()) + .await() + .assertItem(3); + } + + @SuppressWarnings("deprecation") + @Test + public void testCollectFirstAndLastDeprecated() { Multi items = Multi.createFrom().items(1, 2, 3); items .collectItems().first() @@ -52,13 +69,13 @@ public void testCollectFirstAndLast() { public void testCollectWithEmpty() { Multi items = Multi.createFrom().empty(); items - .collectItems().first() + .collect().first() .subscribe().withSubscriber(UniAssertSubscriber.create()) .await() .assertItem(null); items - .collectItems().last() + .collect().last() .subscribe().withSubscriber(UniAssertSubscriber.create()) .await() .assertItem(null); @@ -68,13 +85,13 @@ public void testCollectWithEmpty() { public void testCollectFirstAndLastOnFailure() { Multi failing = Multi.createFrom().failure(new IOException("boom")); failing - .collectItems().first() + .collect().first() .subscribe().withSubscriber(UniAssertSubscriber.create()) .await() .assertFailedWith(IOException.class, "boom"); failing - .collectItems().last() + .collect().last() .subscribe().withSubscriber(UniAssertSubscriber.create()) .await() .assertFailedWith(IOException.class, "boom"); @@ -83,7 +100,7 @@ public void testCollectFirstAndLastOnFailure() { @Test public void testAsList() { UniAssertSubscriber> subscriber = Multi.createFrom().items(1, 2, 3) - .collectItems().asList() + .collect().asList() .subscribe().withSubscriber(UniAssertSubscriber.create()) .await(); @@ -93,7 +110,7 @@ public void testAsList() { @Test public void testCollectIn() { UniAssertSubscriber> subscriber = Multi.createFrom().range(1, 10) - .collectItems().in(LinkedList::new, LinkedList::add) + .collect().in(LinkedList::new, LinkedList::add) .subscribe().withSubscriber(UniAssertSubscriber.create()) .await(); @@ -103,7 +120,7 @@ public void testCollectIn() { @Test public void testCollectInWithSupplierThrowingException() { Multi.createFrom().range(1, 10) - .collectItems().in(() -> { + .collect().in(() -> { throw new IllegalArgumentException("boom"); }, (x, y) -> { }) @@ -114,7 +131,7 @@ public void testCollectInWithSupplierThrowingException() { @Test public void testCollectInWithAccumulatorThrowingException() { Multi.createFrom().range(1, 10) - .collectItems().in(LinkedList::new, (list, res) -> { + .collect().in(LinkedList::new, (list, res) -> { list.add(res); if (res == 5) { throw new IllegalArgumentException("boom"); @@ -127,7 +144,7 @@ public void testCollectInWithAccumulatorThrowingException() { @Test public void testCollectInWithSupplierReturningNull() { Multi.createFrom().range(1, 10) - .collectItems().in(() -> null, (x, y) -> { + .collect().in(() -> null, (x, y) -> { }) .subscribe().withSubscriber(UniAssertSubscriber.create()) .assertFailedWith(NullPointerException.class, "supplier"); @@ -136,7 +153,7 @@ public void testCollectInWithSupplierReturningNull() { @Test public void testCollectInWithAccumulatorSupplierReturningNull() { Multi.createFrom().range(1, 10) - .collectItems().with(new Collector() { + .collect().with(new Collector() { @Override public Supplier supplier() { return () -> 0; @@ -169,7 +186,7 @@ public Set characteristics() { @Test public void testCollectIntoMap() { UniAssertSubscriber> subscriber = persons - .collectItems().asMap(p -> p.firstName) + .collect().asMap(p -> p.firstName) .subscribe().withSubscriber(UniAssertSubscriber.create()) .assertCompleted(); @@ -185,7 +202,7 @@ public void testCollectIntoMap() { @Test public void testCollectAsMapWithEmpty() { UniAssertSubscriber> subscriber = Multi.createFrom(). empty() - .collectItems().asMap(p -> p.firstName) + .collect().asMap(p -> p.firstName) .subscribe().withSubscriber(UniAssertSubscriber.create()) .assertCompleted(); @@ -195,7 +212,7 @@ public void testCollectAsMapWithEmpty() { @Test public void testCollectAsMultiMap() { UniAssertSubscriber>> subscriber = personsWithDuplicates - .collectItems().asMultiMap(p -> p.firstName) + .collect().asMultiMap(p -> p.firstName) .subscribe().withSubscriber(new UniAssertSubscriber<>()) .assertCompleted(); @@ -209,7 +226,7 @@ public void testCollectAsMultiMap() { @Test public void testCollectAsMultiMapWithValueMapper() { UniAssertSubscriber>> subscriber = personsWithDuplicates - .collectItems().asMultiMap(p -> p.firstName, p -> p.id) + .collect().asMultiMap(p -> p.firstName, p -> p.id) .subscribe().withSubscriber(new UniAssertSubscriber<>()) .assertCompleted(); @@ -222,7 +239,7 @@ public void testCollectAsMultiMapWithValueMapper() { @Test public void testCollectAsMultiMapOnEmpty() { UniAssertSubscriber>> subscriber = Multi.createFrom(). empty() - .collectItems().asMultiMap(p -> p.firstName) + .collect().asMultiMap(p -> p.firstName) .subscribe().withSubscriber(new UniAssertSubscriber<>()) .assertCompleted(); assertThat(subscriber.getItem()).hasSize(0); @@ -231,7 +248,7 @@ public void testCollectAsMultiMapOnEmpty() { @Test public void testSumCollector() { - Multi.createFrom().range(1, 5).collectItems().with(Collectors.summingInt(value -> value)) + Multi.createFrom().range(1, 5).collect().with(Collectors.summingInt(value -> value)) .subscribe().withSubscriber(new UniAssertSubscriber<>()).assertCompleted().assertItem(10); } @@ -240,7 +257,7 @@ public void testWithFinisherReturningNull() { List list = new ArrayList<>(); Multi.createFrom().items("a", "b", "c") .map(String::toUpperCase) - .collectItems().with(Collector.of(() -> null, (n, t) -> list.add(t), (X, y) -> null, x -> null)) + .collect().with(Collector.of(() -> null, (n, t) -> list.add(t), (X, y) -> null, x -> null)) .await().indefinitely(); assertThat(list).containsExactly("A", "B", "C"); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCombineTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCombineTest.java index 120aa76f1..7bf847d05 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCombineTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCombineTest.java @@ -97,7 +97,7 @@ public void combineIterableOfStreamsFollowedByAFlatMap() { public void testCombinationOfTwoStreamsAsTuple() { List> list = Multi.createBy() .combining().streams(Multi.createFrom().range(1, 4), Multi.createFrom().range(2, 5)).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(3).containsExactly(Tuple2.of(1, 2), Tuple2.of(2, 3), Tuple2.of(3, 4)); } @@ -107,7 +107,7 @@ public void testCombinationOfAStreamWithItself() { List> list = Multi.createBy() .combining().streams(stream, stream).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(4).containsExactly(Tuple2.of(1, 1), Tuple2.of(2, 2), Tuple2.of(3, 3), Tuple2.of(4, 4)); } @@ -119,7 +119,7 @@ public void testCombinationOfThreeStreamsAsTuple() { Multi s3 = Multi.createFrom().range(3, 6); List> list = Multi.createBy() .combining().streams(s1, s2, s3).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(3).containsExactly(Tuple3.of(1, 2, 3), Tuple3.of(2, 3, 4), Tuple3.of(3, 4, 5)); } @@ -131,7 +131,7 @@ public void testCombinationOfFourStreamsAsTuple() { Multi s4 = Multi.createFrom().range(4, 7); List> list = Multi.createBy() .combining().streams(s1, s2, s3, s4).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(3) .containsExactly(Tuple4.of(1, 2, 3, 4), Tuple4.of(2, 3, 4, 5), Tuple4.of(3, 4, 5, 6)); @@ -146,7 +146,7 @@ public void testCombinationOfFiveStreamsAsTuple() { Multi s5 = Multi.createFrom().range(5, 8); List> list = Multi.createBy() .combining().streams(s1, s2, s3, s4, s5).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(3) .containsExactly(Tuple5.of(1, 2, 3, 4, 5), Tuple5.of(2, 3, 4, 5, 6), @@ -163,7 +163,7 @@ public void testCombinationOfSixStreamsAsTuple() { Multi s6 = Multi.createFrom().range(6, 9); List> list = Multi.createBy() .combining().streams(s1, s2, s3, s4, s5, s6).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(3) .containsExactly( Tuple6.of(1, 2, 3, 4, 5, 6), @@ -182,7 +182,7 @@ public void testCombinationOfSevenStreamsAsTuple() { Multi s7 = Multi.createFrom().range(7, 10); List> list = Multi.createBy() .combining().streams(s1, s2, s3, s4, s5, s6, s7).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(3) .containsExactly( Tuple7.of(1, 2, 3, 4, 5, 6, 7), @@ -202,7 +202,7 @@ public void testCombinationOfEightStreamsAsTuple() { Multi s8 = Multi.createFrom().range(8, 11); List> list = Multi.createBy() .combining().streams(s1, s2, s3, s4, s5, s6, s7, s8).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(3) .containsExactly( Tuple8.of(1, 2, 3, 4, 5, 6, 7, 8), @@ -224,7 +224,7 @@ public void testCombinationOfNineStreamsAsTuple() { List> list = Multi .createBy() .combining().streams(s1, s2, s3, s4, s5, s6, s7, s8, s9).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(3) .containsExactly( Tuple9.of(1, 2, 3, 4, 5, 6, 7, 8, 9), @@ -256,13 +256,13 @@ public void testCombinationOfAStreamsOfDifferentSize() { List> list = Multi.createBy() .combining().streams(stream1, stream2).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(4).containsExactly(Tuple2.of(1, 1), Tuple2.of(2, 2), Tuple2.of(3, 3), Tuple2.of(4, 4)); list = Multi.createBy() .combining().streams(stream2, stream1).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(4).containsExactly(Tuple2.of(1, 1), Tuple2.of(2, 2), Tuple2.of(3, 3), Tuple2.of(4, 4)); } @@ -274,13 +274,13 @@ public void testCombinationOfAStreamsOfDifferentSizeUsingLatest() { List> list = Multi.createBy() .combining().streams(stream1, stream2).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(7).containsExactly(Tuple2.of(4, 1), Tuple2.of(4, 2), Tuple2.of(4, 3), Tuple2.of(4, 4), Tuple2.of(4, 5), Tuple2.of(4, 6), Tuple2.of(4, 7)); list = Multi.createBy() .combining().streams(stream2, stream1).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(4).containsExactly(Tuple2.of(7, 1), Tuple2.of(7, 2), Tuple2.of(7, 3), Tuple2.of(7, 4)); } @@ -444,7 +444,7 @@ public void testCombinationOfAFailingStream() { Multi.createBy() .combining().streams(stream, fail).asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); }); } @@ -605,15 +605,15 @@ public void testCombineLatest() { List> list = Multi.createBy().combining().streams(stream, stream).latestItems() .asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple2.of(3, 1), Tuple2.of(3, 2), Tuple2.of(3, 3)); List list2 = Multi.createBy().combining().streams(stream, stream).latestItems().using((a, b) -> a) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list2).containsExactly(3, 3, 3); list2 = Multi.createBy().combining().streams(stream, stream).latestItems().using((a, b) -> b) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list2).containsExactly(1, 2, 3); } @@ -622,7 +622,7 @@ public void testCombineLatestWithSinglePublisher() { Multi stream = Multi.createFrom().items(1, 2, 3); List list = Multi.createBy().combining().streams(Collections.singletonList(stream)) .using(l -> (Integer) l.get(0)) - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(list).containsExactly(1, 2, 3); } @@ -634,7 +634,7 @@ public void testCombineLatestWithEmpty() { List> list = Multi.createBy().combining().streams(stream, empty).latestItems() .asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).isEmpty(); } @@ -646,7 +646,7 @@ public void testCombineLatestWith3Streams() { List> list = Multi.createBy().combining().streams(one, two, three) .latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple3.of(1, 2, 3), Tuple3.of(1, 2, 4)); } @@ -660,12 +660,12 @@ public void testCombineLatestWithFourStreams() { List> list = Multi.createBy().combining() .streams(one, two, three, four).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple4.of(1, 2, 4, 5)); list = Multi.createBy().combining().streams(one, two, four, three).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple4.of(1, 2, 5, 3), Tuple4.of(1, 2, 5, 4)); } @@ -680,18 +680,18 @@ public void testCombineLatestWithFiveStreams() { List> list = Multi.createBy().combining() .streams(one, two, three, four, five).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple5.of(1, 2, 4, 5, 6)); list = Multi.createBy().combining().streams(one, two, four, five, three).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple5.of(1, 2, 5, 6, 3), Tuple5.of(1, 2, 5, 6, 4)); list = Multi.createBy().combining().streams(one, two, four, Multi.createFrom(). empty(), three) .latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).isEmpty(); } @@ -706,18 +706,18 @@ public void testCombineLatestWithSixStreams() { List> list = Multi.createBy().combining() .streams(one, two, three, four, five, six).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple6.of(1, 2, 4, 5, 6, 7)); list = Multi.createBy().combining().streams(one, two, four, five, six, three).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple6.of(1, 2, 5, 6, 7, 3), Tuple6.of(1, 2, 5, 6, 7, 4)); list = Multi.createBy().combining().streams(one, two, four, Multi.createFrom(). empty(), six, three) .latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).isEmpty(); } @@ -733,12 +733,12 @@ public void testCombineLatestWithSevenStreams() { List> list = Multi.createBy().combining() .streams(one, two, three, four, five, six, seven).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple7.of(1, 2, 4, 5, 6, 7, 8)); list = Multi.createBy().combining().streams(one, two, four, five, six, seven, three).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple7.of(1, 2, 5, 6, 7, 8, 3), Tuple7.of(1, 2, 5, 6, 7, 8, 4)); @@ -746,7 +746,7 @@ public void testCombineLatestWithSevenStreams() { list = Multi.createBy().combining() .streams(one, two, four, Multi.createFrom(). empty(), six, three, seven) .latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).isEmpty(); } @@ -764,13 +764,13 @@ public void testCombineLatestWithEightStreams() { List> list = Multi.createBy() .combining() .streams(one, two, three, four, five, six, seven, eight).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple8.of(1, 2, 4, 5, 6, 7, 8, 9)); list = Multi.createBy().combining().streams(one, two, four, five, six, seven, eight, three).latestItems() .asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple8.of(1, 2, 5, 6, 7, 8, 9, 3), Tuple8.of(1, 2, 5, 6, 7, 8, 9, 4)); @@ -778,7 +778,7 @@ public void testCombineLatestWithEightStreams() { list = Multi.createBy().combining() .streams(one, two, four, Multi.createFrom(). empty(), six, three, seven, eight) .latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).isEmpty(); } @@ -798,13 +798,13 @@ public void testCombineLatestWithNineStreams() { .createBy() .combining() .streams(one, two, three, four, five, six, seven, eight, nine).latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple9.of(1, 2, 4, 5, 6, 7, 8, 9, 10)); list = Multi.createBy().combining().streams(one, two, four, five, six, seven, eight, nine, three).latestItems() .asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(Tuple9.of(1, 2, 5, 6, 7, 8, 9, 10, 3), Tuple9.of(1, 2, 5, 6, 7, 8, 9, 10, 4)); @@ -812,7 +812,7 @@ public void testCombineLatestWithNineStreams() { list = Multi.createBy().combining() .streams(one, two, four, Multi.createFrom(). empty(), six, three, seven, eight, nine) .latestItems().asTuple() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).isEmpty(); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCreateFromItemsTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCreateFromItemsTest.java index 708f440ea..805da55bf 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCreateFromItemsTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiCreateFromItemsTest.java @@ -139,13 +139,13 @@ public void testCreateFromStreamOfOne() { public void testThatStreamCannotBeReused() { Stream stream = Stream.of(1, 2, 3, 4); List list = Multi.createFrom().items(stream) - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(list).containsExactly(1, 2, 3, 4); assertThatThrownBy(() -> Multi.createFrom().items(stream) - .collectItems().asList() + .collect().asList() .await().indefinitely()).isInstanceOf(IllegalStateException.class); } @@ -154,13 +154,13 @@ public void testThatMultiBasedOnStreamCannotBeReused() { Stream stream = Stream.of(1, 2, 3, 4); Multi multi = Multi.createFrom().items(stream); List list = multi - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(list).containsExactly(1, 2, 3, 4); assertThatThrownBy(() -> multi - .collectItems().asList() + .collect().asList() .await().indefinitely()).isInstanceOf(IllegalStateException.class); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiFilterTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiFilterTest.java index 602038cbe..f77e780de 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiFilterTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiFilterTest.java @@ -58,7 +58,7 @@ public void testFilteringWithPredicate() { Predicate test = x -> x % 2 != 0; assertThat(Multi.createFrom().range(1, 4) .transform().byFilteringItemsWith(test) - .collectItems().asList() + .collect().asList() .await().indefinitely()).containsExactly(1, 3); } @@ -68,7 +68,7 @@ public void testFilteringWithUni() { .transform() .byTestingItemsWith( x -> Uni.createFrom().completionStage(() -> CompletableFuture.supplyAsync(() -> x % 2 != 0))) - .collectItems().asList() + .collect().asList() .await().indefinitely()).containsExactly(1, 3); } @@ -77,7 +77,7 @@ public void testFilterShortcut() { Predicate test = x -> x % 2 != 0; assertThat(Multi.createFrom().range(1, 4) .filter(test) - .collectItems().asList() + .collect().asList() .await().indefinitely()).containsExactly(1, 3); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiGroupTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiGroupTest.java index 2dec91d9f..e94bdb6a6 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiGroupTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiGroupTest.java @@ -41,24 +41,36 @@ public void cleanup() { @Test public void testGroupIntoListsWithSize0() { assertThrows(IllegalArgumentException.class, - () -> Multi.createFrom().range(1, 5).groupItems().intoLists().of(0)); + () -> Multi.createFrom().range(1, 5).group().intoLists().of(0)); } @Test public void testGroupIntoListsWithSize0AndSkip() { assertThrows(IllegalArgumentException.class, - () -> Multi.createFrom().range(1, 5).groupItems().intoLists().of(0, 1)); + () -> Multi.createFrom().range(1, 5).group().intoLists().of(0, 1)); } @Test public void testGroupIntoListsWithSkip0() { assertThrows(IllegalArgumentException.class, - () -> Multi.createFrom().range(1, 5).groupItems().intoLists().of(1, 0)); + () -> Multi.createFrom().range(1, 5).group().intoLists().of(1, 0)); } @Test public void testGroupIntoListsOfTwoElements() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoLists().of(2) + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoLists().of(2) + .subscribe().withSubscriber(AssertSubscriber.create(100)); + subscriber.assertCompleted(); + assertThat(subscriber.getItems()).containsExactly( + Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6), Arrays.asList(7, 8), + Collections.singletonList(9)); + } + + @SuppressWarnings("deprecation") + @Test + public void testGroupIntoListsOfTwoElementsDeprecated() { + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10) + .groupItems().intoLists().of(2) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertCompleted(); assertThat(subscriber.getItems()).containsExactly( @@ -68,7 +80,7 @@ public void testGroupIntoListsOfTwoElements() { @Test public void testGroupIntoListsOfTwoElementsWithRequests() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoLists().of(2) + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoLists().of(2) .subscribe().withSubscriber(AssertSubscriber.create()); subscriber .assertSubscribed().assertHasNotReceivedAnyItem() @@ -87,7 +99,7 @@ public void testGroupIntoListsOfTwoElementsWithRequests() { @Test public void testGroupIntoListsOfTwoElementsWithSkip() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoLists() + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoLists() .of(2, 3) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertCompleted(); @@ -97,7 +109,7 @@ public void testGroupIntoListsOfTwoElementsWithSkip() { @Test public void testGroupIntoListsOfTwoElementsWithSkipAndFailure() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoLists() + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoLists() .of(2, 3).onCompletion().fail() .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertFailedWith(NoSuchElementException.class, null); @@ -107,7 +119,7 @@ public void testGroupIntoListsOfTwoElementsWithSkipAndFailure() { @Test public void testGroupIntoListsOfTwoElementsWithSkipSmallerThanSize() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoLists() + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoLists() .of(2, 1) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertCompleted(); @@ -119,7 +131,7 @@ public void testGroupIntoListsOfTwoElementsWithSkipSmallerThanSize() { @Test public void testGroupIntoListsOfTwoElementsWithSkipSmallerThanSizeAndFailure() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoLists() + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoLists() .of(2, 1) .onCompletion().fail() .subscribe().withSubscriber(AssertSubscriber.create(100)); @@ -132,7 +144,7 @@ public void testGroupIntoListsOfTwoElementsWithSkipSmallerThanSizeAndFailure() { @Test public void testGroupIntoListsOfTwoElementsWithRequestsAndSkip() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoLists() + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoLists() .of(2, 3) .subscribe().withSubscriber(AssertSubscriber.create()); subscriber @@ -151,12 +163,12 @@ public void testGroupIntoListsOfTwoElementsWithRequestsAndSkip() { @Test public void testCombinationOfToListsAndAwait() { - Multi> multi = Multi.createFrom().range(1, 10).groupItems().intoLists().of(2); + Multi> multi = Multi.createFrom().range(1, 10).group().intoLists().of(2); - assertThat(multi.collectItems().first().await().indefinitely()).containsExactly(1, 2); - assertThat(multi.collectItems().last().await().indefinitely()).containsExactly(9); + assertThat(multi.collect().first().await().indefinitely()).containsExactly(1, 2); + assertThat(multi.collect().last().await().indefinitely()).containsExactly(9); - assertThat(multi.collectItems().asList().await().indefinitely()).hasSize(5) + assertThat(multi.collect().asList().await().indefinitely()).hasSize(5) .containsExactly(Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6), Arrays.asList(7, 8), Collections.singletonList(9)); } @@ -164,20 +176,20 @@ public void testCombinationOfToListsAndAwait() { @Test public void testAsListsOnEmptyStream() { assertThat( - Multi.createFrom().empty().groupItems().intoLists().of(2).collectItems().last().await().indefinitely()) + Multi.createFrom().empty().group().intoLists().of(2).collect().last().await().indefinitely()) .isNull(); } @Test public void testAsListsWithNegativeDuration() { assertThrows(IllegalArgumentException.class, - () -> Multi.createFrom().range(1, 10).groupItems().intoLists().every(Duration.ofMillis(-2))); + () -> Multi.createFrom().range(1, 10).group().intoLists().every(Duration.ofMillis(-2))); } @Test public void testAsListsWithDuration() { Multi publisher = Multi.createFrom().publisher(Multi.createFrom().ticks().every(Duration.ofMillis(2))); - AssertSubscriber> subscriber = publisher.groupItems().intoLists().every(Duration.ofMillis(100)) + AssertSubscriber> subscriber = publisher.group().intoLists().every(Duration.ofMillis(100)) .subscribe() .withSubscriber(AssertSubscriber.create(100)); @@ -189,7 +201,7 @@ public void testAsListsWithDuration() { public void testAsListsWithDurationWithCompletion() { Multi publisher = Multi.createFrom().publisher(Multi.createFrom().ticks().every(Duration.ofMillis(2))) .transform().byTakingFirstItems(10); - AssertSubscriber> subscriber = publisher.groupItems().intoLists().every(Duration.ofMillis(100)) + AssertSubscriber> subscriber = publisher.group().intoLists().every(Duration.ofMillis(100)) .subscribe() .withSubscriber(AssertSubscriber.create(100)); subscriber.await(); @@ -201,7 +213,7 @@ public void testAsListsWithDurationWithFailure() { Multi publisher = Multi.createFrom().publisher(Multi.createFrom().ticks().every(Duration.ofMillis(2))) .transform().byTakingFirstItems(10) .onCompletion().failWith(new IOException("boom")); - AssertSubscriber> subscriber = publisher.groupItems().intoLists().every(Duration.ofMillis(100)) + AssertSubscriber> subscriber = publisher.group().intoLists().every(Duration.ofMillis(100)) .subscribe() .withSubscriber(AssertSubscriber.create(100)); subscriber.await(); @@ -214,7 +226,7 @@ public void testAsListsWithDurationAndLackOfRequests() { AtomicBoolean cancelled = new AtomicBoolean(); Multi publisher = Multi.createFrom().publisher(Multi.createFrom().ticks().every(Duration.ofMillis(2))) .onCancellation().invoke(() -> cancelled.set(true)); - AssertSubscriber> subscriber = publisher.groupItems().intoLists().every(Duration.ofMillis(100)) + AssertSubscriber> subscriber = publisher.group().intoLists().every(Duration.ofMillis(100)) .subscribe() .withSubscriber(AssertSubscriber.create(2)); @@ -226,24 +238,24 @@ public void testAsListsWithDurationAndLackOfRequests() { @Test public void testGroupIntoMultisWithSize0() { assertThrows(IllegalArgumentException.class, - () -> Multi.createFrom().range(1, 5).groupItems().intoMultis().of(0)); + () -> Multi.createFrom().range(1, 5).group().intoMultis().of(0)); } @Test public void testGroupIntoMultisWithSize0AndSkip() { assertThrows(IllegalArgumentException.class, - () -> Multi.createFrom().range(1, 5).groupItems().intoMultis().of(0, 1)); + () -> Multi.createFrom().range(1, 5).group().intoMultis().of(0, 1)); } @Test public void testGroupIntoMultisWithSkip0() { assertThrows(IllegalArgumentException.class, - () -> Multi.createFrom().range(1, 5).groupItems().intoMultis().of(1, 0)); + () -> Multi.createFrom().range(1, 5).group().intoMultis().of(1, 0)); } @Test public void testGroupIntoMultisOfTwoElements() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoMultis() + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoMultis() .of(2) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertCompleted(); @@ -255,7 +267,7 @@ public void testGroupIntoMultisOfTwoElements() { @Test public void testGroupIntoMultisOfTwoElementsWithFailure() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoMultis() + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoMultis() .of(2) .onCompletion().fail() .subscribe().withSubscriber(AssertSubscriber.create(100)); @@ -269,14 +281,14 @@ public void testGroupIntoMultisOfTwoElementsWithFailure() { private List> flatten(List> items) { List> list = new ArrayList<>(); for (Multi multi : items) { - list.add(multi.collectItems().asList().await().indefinitely()); + list.add(multi.collect().asList().await().indefinitely()); } return list; } @Test public void testGroupIntoMultisOfTwoElementsWithRequests() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoMultis() + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoMultis() .of(2) .subscribe().withSubscriber(AssertSubscriber.create()); subscriber @@ -295,7 +307,7 @@ public void testGroupIntoMultisOfTwoElementsWithRequests() { @Test public void testGroupIntoMultisOfTwoElementsWithSkip() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoMultis() + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoMultis() .of(2, 3) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertCompleted(); @@ -305,7 +317,7 @@ public void testGroupIntoMultisOfTwoElementsWithSkip() { @Test public void testGroupIntoMultisOfTwoElementsWithSkipSmallerThanSize() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoMultis() + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoMultis() .of(2, 1) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertCompleted(); @@ -317,7 +329,7 @@ public void testGroupIntoMultisOfTwoElementsWithSkipSmallerThanSize() { @Test public void testGroupIntoMultisOfTwoElementsWithRequestsAndSkip() { - AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).groupItems().intoMultis() + AssertSubscriber> subscriber = Multi.createFrom().range(1, 10).group().intoMultis() .of(2, 3) .subscribe().withSubscriber(AssertSubscriber.create()); subscriber @@ -335,14 +347,14 @@ public void testGroupIntoMultisOfTwoElementsWithRequestsAndSkip() { @Test public void testCombinationOfToMultisAndAwait() { - Multi> multi = Multi.createFrom().range(1, 10).groupItems().intoMultis().of(2); + Multi> multi = Multi.createFrom().range(1, 10).group().intoMultis().of(2); - assertThat(multi.collectItems().first().await().indefinitely().collectItems().asList().await().indefinitely()) + assertThat(multi.collect().first().await().indefinitely().collect().asList().await().indefinitely()) .containsExactly(1, 2); - assertThat(multi.collectItems().last().await().indefinitely().collectItems().asList().await().indefinitely()) + assertThat(multi.collect().last().await().indefinitely().collect().asList().await().indefinitely()) .containsExactly(9); - assertThat(flatten(multi.collectItems().asList().await().indefinitely())).hasSize(5) + assertThat(flatten(multi.collect().asList().await().indefinitely())).hasSize(5) .containsExactly(Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6), Arrays.asList(7, 8), Collections.singletonList(9)); } @@ -350,20 +362,20 @@ public void testCombinationOfToMultisAndAwait() { @Test public void testAsMultisOnEmptyStream() { assertThat( - Multi.createFrom().empty().groupItems().intoMultis().of(2).collectItems().last().await().indefinitely()) + Multi.createFrom().empty().group().intoMultis().of(2).collect().last().await().indefinitely()) .isNull(); } @Test public void testAsMultisWithNegativeDuration() { assertThrows(IllegalArgumentException.class, - () -> Multi.createFrom().range(1, 10).groupItems().intoMultis().every(Duration.ofMillis(-2))); + () -> Multi.createFrom().range(1, 10).group().intoMultis().every(Duration.ofMillis(-2))); } @Test public void testAsMultisWithDuration() { Multi publisher = Multi.createFrom().publisher(Multi.createFrom().ticks().every(Duration.ofMillis(2))); - AssertSubscriber> subscriber = publisher.groupItems().intoMultis() + AssertSubscriber> subscriber = publisher.group().intoMultis() .every(Duration.ofMillis(100)) .subscribe() .withSubscriber(AssertSubscriber.create(100)); @@ -375,10 +387,10 @@ public void testAsMultisWithDuration() { @Test public void testBasicTimeWindow() { Multi> multi = Multi.createFrom().range(1, 7) - .groupItems().intoMultis().every(Duration.ofMillis(1)); + .group().intoMultis().every(Duration.ofMillis(1)); Uni> uni = multi .onItem().transformToMultiAndConcatenate(m -> m) - .collectItems().asList(); + .collect().asList(); List list = uni.await().atMost(Duration.ofSeconds(4)); assertThat(list).contains(1, 2, 3, 4, 5, 6); @@ -389,7 +401,7 @@ public void testBasicTimeWindowWithFailure() { Multi multi = Multi.createBy().concatenating().streams( Multi.createFrom().range(1, 7), Multi.createFrom().failure(() -> new IOException("boom"))) - .groupItems().intoMultis().every(Duration.ofMillis(1)) + .group().intoMultis().every(Duration.ofMillis(1)) .onItem().transformToMultiAndConcatenate(m -> m); multi.subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)) @@ -402,8 +414,8 @@ public void testBasicTimeWindowWithFailure() { public void testThatWindowWithDurationEmitsEmptyLists() { AssertSubscriber> subscriber = AssertSubscriber.create(3); Multi.createFrom().nothing() - .groupItems().intoMultis().every(Duration.ofMillis(10)) - .onItem().transformToUniAndMerge(m -> m.collectItems().asList()) + .group().intoMultis().every(Duration.ofMillis(10)) + .onItem().transformToUniAndMerge(m -> m.collect().asList()) .subscribe().withSubscriber(subscriber); await().until(() -> subscriber.getItems().size() == 3); @@ -415,14 +427,14 @@ public void testThatWindowWithDurationEmitsEmptyLists() { @Test public void testGroupByWithKeyMapperOnly() { AssertSubscriber> subscriber = Multi.createFrom().range(1, 10) - .groupItems().by(i -> i % 2) + .group().by(i -> i % 2) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertCompleted(); assertThat(subscriber.getItems()).hasSize(2); - List odd = subscriber.getItems().get(0).collectItems().asList().await().indefinitely(); - List even = subscriber.getItems().get(1).collectItems().asList().await().indefinitely(); + List odd = subscriber.getItems().get(0).collect().asList().await().indefinitely(); + List even = subscriber.getItems().get(1).collect().asList().await().indefinitely(); assertThat(subscriber.getItems().get(0).key()).isEqualTo(1); assertThat(subscriber.getItems().get(1).key()).isEqualTo(0); @@ -434,14 +446,14 @@ public void testGroupByWithKeyMapperOnly() { @Test public void testGroupByWithKeyMapperAndValueMapper() { AssertSubscriber> subscriber = Multi.createFrom().range(1, 10) - .groupItems().by(i -> i % 2, t -> Integer.toString(t)) + .group().by(i -> i % 2, t -> Integer.toString(t)) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertCompleted(); assertThat(subscriber.getItems()).hasSize(2); - List odd = subscriber.getItems().get(0).collectItems().asList().await().indefinitely(); - List even = subscriber.getItems().get(1).collectItems().asList().await().indefinitely(); + List odd = subscriber.getItems().get(0).collect().asList().await().indefinitely(); + List even = subscriber.getItems().get(1).collect().asList().await().indefinitely(); assertThat(subscriber.getItems().get(0).key()).isEqualTo(1); assertThat(subscriber.getItems().get(1).key()).isEqualTo(0); @@ -453,32 +465,32 @@ public void testGroupByWithKeyMapperAndValueMapper() { @Test public void testGroupByProducingASingleGroup() { AssertSubscriber> subscriber = Multi.createFrom().range(1, 10) - .groupItems().by(i -> 0) + .group().by(i -> 0) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertCompleted(); assertThat(subscriber.getItems()).hasSize(1); - List numbers = subscriber.getItems().get(0).collectItems().asList().await().indefinitely(); + List numbers = subscriber.getItems().get(0).collect().asList().await().indefinitely(); assertThat(subscriber.getItems().get(0).key()).isEqualTo(0); assertThat(numbers).hasSize(9); } @Test public void testGroupByWithNullKeyMapper() { - assertThrows(IllegalArgumentException.class, () -> Multi.createFrom().range(1, 10).groupItems().by(null)); + assertThrows(IllegalArgumentException.class, () -> Multi.createFrom().range(1, 10).group().by(null)); } @Test public void testGroupByWithNullValueMapper() { assertThrows(IllegalArgumentException.class, - () -> Multi.createFrom().range(1, 10).groupItems().by(i -> i % 2, null)); + () -> Multi.createFrom().range(1, 10).group().by(i -> i % 2, null)); } @Test public void testGroupByOnFailingMulti() { AssertSubscriber> subscriber = Multi.createFrom() . failure(new IOException("boom")) - .groupItems().by(i -> i % 2) + .group().by(i -> i % 2) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertFailedWith(IOException.class, "boom"); @@ -488,7 +500,7 @@ public void testGroupByOnFailingMulti() { @Test public void testGroupByOnEmptyMulti() { AssertSubscriber> subscriber = Multi.createFrom(). empty() - .groupItems().by(i -> i % 2) + .group().by(i -> i % 2) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertCompleted().assertHasNotReceivedAnyItem(); @@ -497,7 +509,7 @@ public void testGroupByOnEmptyMulti() { @Test public void testGroupByFollowedWithAFlatMap() { AssertSubscriber subscriber = Multi.createFrom().range(1, 10) - .groupItems().by(i -> 1) + .group().by(i -> 1) .flatMap(gm -> gm) .subscribe().withSubscriber(AssertSubscriber.create(100)); @@ -512,7 +524,7 @@ public void requestingIsResumedAfterCancellationOfAGroupedMulti() { final AtomicBoolean done = new AtomicBoolean(); Multi.createFrom().range(0, 1001) .onItem().invoke(x -> counter.getAndIncrement()) - .groupItems().intoMultis().of(1) + .group().intoMultis().of(1) .subscribe().with(multi -> { AssertSubscriber subscriber = AssertSubscriber.create(0L); subscribers.add(subscriber); @@ -530,7 +542,7 @@ public void requestingIsResumedAfterCancellationOfAGroupedMulti() { @Test public void testSkipGroupWithFailures() { AssertSubscriber> subscriber = Multi.createFrom().failure(new IOException("boom")) - .groupItems().intoLists().of(2, 4) + .group().intoLists().of(2, 4) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); subscriber.assertFailedWith(IOException.class, "boom"); @@ -539,7 +551,7 @@ public void testSkipGroupWithFailures() { @Test public void testSkipGroupAsMultisWithFailures() { AssertSubscriber> subscriber = Multi.createFrom().failure(new IOException("boom")) - .groupItems().intoMultis().of(2, 4) + .group().intoMultis().of(2, 4) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); subscriber.assertFailedWith(IOException.class, "boom"); @@ -548,7 +560,7 @@ public void testSkipGroupAsMultisWithFailures() { @Test public void testOverlapGroupWithFailures() { AssertSubscriber> subscriber = Multi.createFrom().failure(new IOException("boom")) - .groupItems().intoLists().of(4, 2) + .group().intoLists().of(4, 2) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); subscriber.assertFailedWith(IOException.class, "boom"); @@ -557,7 +569,7 @@ public void testOverlapGroupWithFailures() { @Test public void testOverlapGroupAsMultisWithFailures() { AssertSubscriber> subscriber = Multi.createFrom().failure(new IOException("boom")) - .groupItems().intoMultis().of(4, 2) + .group().intoMultis().of(4, 2) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); subscriber.assertFailedWith(IOException.class, "boom"); @@ -566,7 +578,7 @@ public void testOverlapGroupAsMultisWithFailures() { @Test public void testExactGroupAsMultisWithFailures() { AssertSubscriber> subscriber = Multi.createFrom().failure(new IOException("boom")) - .groupItems().intoMultis().of(2) + .group().intoMultis().of(2) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); subscriber.assertFailedWith(IOException.class, "boom"); @@ -594,7 +606,7 @@ public void subscribe(MultiSubscriber subscriber) { }; AssertSubscriber> subscriber = rogue - .groupItems().intoLists().of(2, 4) + .group().intoLists().of(2, 4) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); subscriber.assertFailedWith(IOException.class, "boom-1"); @@ -623,7 +635,7 @@ public void subscribe(MultiSubscriber subscriber) { }; AssertSubscriber subscriber = rogue - .groupItems().intoMultis().of(2, 4) + .group().intoMultis().of(2, 4) .onItem().transformToMultiAndConcatenate(m -> m) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); @@ -653,7 +665,7 @@ public void subscribe(MultiSubscriber subscriber) { }; AssertSubscriber> subscriber = rogue - .groupItems().intoLists().of(4, 2) + .group().intoLists().of(4, 2) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); subscriber.assertFailedWith(IOException.class, "boom-1"); @@ -682,7 +694,7 @@ public void subscribe(MultiSubscriber subscriber) { }; AssertSubscriber subscriber = rogue - .groupItems().intoMultis().of(4, 2) + .group().intoMultis().of(4, 2) .onItem().transformToMultiAndConcatenate(m -> m) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); @@ -712,7 +724,7 @@ public void subscribe(MultiSubscriber subscriber) { }; AssertSubscriber subscriber = rogue - .groupItems().intoMultis().of(2) + .group().intoMultis().of(2) .onItem().transformToMultiAndConcatenate(m -> m) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); @@ -724,19 +736,19 @@ public void subscribe(MultiSubscriber subscriber) { public void testInvalidRequestsWhenGroupingIntoLists() { Subscriber> listExact = Mocks.subscriber(-1); Multi.createFrom().items(1, 2, 3, 4) - .groupItems().intoLists().of(2) + .group().intoLists().of(2) .subscribe().withSubscriber(listExact); verify(listExact).onError(any(IllegalArgumentException.class)); Subscriber> listSkip = Mocks.subscriber(-1); Multi.createFrom().items(1, 2, 3, 4) - .groupItems().intoLists().of(2, 4) + .group().intoLists().of(2, 4) .subscribe().withSubscriber(listSkip); verify(listSkip).onError(any(IllegalArgumentException.class)); Subscriber> listOverlap = Mocks.subscriber(-1); Multi.createFrom().items(1, 2, 3, 4) - .groupItems().intoLists().of(4, 2) + .group().intoLists().of(4, 2) .subscribe().withSubscriber(listOverlap); verify(listOverlap).onError(any(IllegalArgumentException.class)); } @@ -745,19 +757,19 @@ public void testInvalidRequestsWhenGroupingIntoLists() { public void testInvalidRequestsWhenGroupingIntoMultis() { Subscriber> listExact = Mocks.subscriber(-1); Multi.createFrom().items(1, 2, 3, 4) - .groupItems().intoMultis().of(2) + .group().intoMultis().of(2) .subscribe().withSubscriber(listExact); verify(listExact).onError(any(IllegalArgumentException.class)); Subscriber> listSkip = Mocks.subscriber(-1); Multi.createFrom().items(1, 2, 3, 4) - .groupItems().intoMultis().of(2, 4) + .group().intoMultis().of(2, 4) .subscribe().withSubscriber(listSkip); verify(listSkip).onError(any(IllegalArgumentException.class)); Subscriber> listOverlap = Mocks.subscriber(-1); Multi.createFrom().items(1, 2, 3, 4) - .groupItems().intoMultis().of(4, 2) + .group().intoMultis().of(4, 2) .subscribe().withSubscriber(listOverlap); verify(listOverlap).onError(any(IllegalArgumentException.class)); @@ -766,7 +778,7 @@ public void testInvalidRequestsWhenGroupingIntoMultis() { @Test public void testGroupByWithKeyMapperThrowingException() { AssertSubscriber> subscriber = Multi.createFrom().range(1, 10) - .groupItems(). by(i -> { + .group(). by(i -> { throw new ArithmeticException("boom"); }) .subscribe().withSubscriber(AssertSubscriber.create(100)); @@ -777,7 +789,7 @@ public void testGroupByWithKeyMapperThrowingException() { @Test public void testGroupByWithValueMapperThrowingException() { AssertSubscriber> subscriber = Multi.createFrom().range(1, 10) - .groupItems(). by(i -> i % 2, i -> { + .group(). by(i -> i % 2, i -> { throw new TestException("boom"); }) .subscribe().withSubscriber(AssertSubscriber.create(100)); @@ -788,7 +800,7 @@ public void testGroupByWithValueMapperThrowingException() { @Test public void testGroupByWithValueMapperReturningNull() { AssertSubscriber> subscriber = Multi.createFrom().range(1, 10) - .groupItems(). by(i -> i % 2, i -> null) + .group(). by(i -> i % 2, i -> null) .subscribe().withSubscriber(AssertSubscriber.create(100)); subscriber.assertFailedWith(NullPointerException.class, ""); @@ -797,7 +809,7 @@ public void testGroupByWithValueMapperReturningNull() { @Test public void testCancellationOnUpstream() { AssertSubscriber> subscriber = Multi.createFrom().ticks().every(Duration.ofMillis(2)) - .groupItems().by(l -> l % 2) + .group().by(l -> l % 2) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); subscriber.assertSubscribed(); @@ -823,7 +835,7 @@ public void testCancellationOnUpstream() { @Test public void testCancellationOnGroup() { AssertSubscriber> subscriber = Multi.createFrom().ticks().every(Duration.ofMillis(2)) - .groupItems().by(l -> l % 2) + .group().by(l -> l % 2) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); subscriber.assertSubscribed(); @@ -848,7 +860,7 @@ public void testCancellationOnGroup() { @Test public void testImmediateCancellationOnUpstream() { AssertSubscriber> subscriber = Multi.createFrom().ticks().every(Duration.ofMillis(2)) - .groupItems().by(l -> l % 2) + .group().by(l -> l % 2) .subscribe().withSubscriber(new AssertSubscriber<>(Long.MAX_VALUE, true)); subscriber.assertSubscribed(); @@ -864,7 +876,7 @@ public void testGroupByWithUpstreamFailure() { Multi.createFrom().emitter((Consumer>) emitter::set)); AssertSubscriber> subscriber = multi - .groupItems().by(l -> l % 2) + .group().by(l -> l % 2) .subscribe().withSubscriber(AssertSubscriber.create(Long.MAX_VALUE)); subscriber.assertSubscribed(); @@ -890,7 +902,7 @@ public void testGroupByWithUpstreamFailure() { public void testGroupIntoListsWithMaximumDelay() { Multi publisher = Multi.createFrom().ticks().every(Duration.ofMillis(10)); - AssertSubscriber> subscriber = publisher.groupItems().intoLists().of(3, Duration.ofMillis(100)) + AssertSubscriber> subscriber = publisher.group().intoLists().of(3, Duration.ofMillis(100)) .subscribe() .withSubscriber(AssertSubscriber.create(10)); diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiOnEventTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiOnEventTest.java index c4fe2688d..0fd3a743b 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiOnEventTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiOnEventTest.java @@ -639,7 +639,7 @@ public void testCallOnItem() { res.set(i); return sub.onItem().invoke(c -> twoGotCalled.incrementAndGet()); }) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(r).containsExactly(1, 2); assertThat(twoGotCalled).hasValue(2); @@ -655,7 +655,7 @@ public void testCallOnItemWithShortcut() { res.set(i); return sub.invoke(c -> twoGotCalled.incrementAndGet()); }) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(r).containsExactly(1, 2); assertThat(twoGotCalled).hasValue(2); @@ -672,7 +672,7 @@ public void testCallOnFailure() { res.set(i); return sub.onItem().invoke(c -> twoGotCalled.incrementAndGet()); }) - .collectItems().asList().await().indefinitely()) + .collect().asList().await().indefinitely()) .isInstanceOf(CompletionException.class) .hasCauseInstanceOf(IOException.class) .hasMessageContaining("boom"); @@ -692,7 +692,7 @@ public void testFailureInAsyncCallback() { } return Uni.createFrom().nullItem(); }) - .collectItems().asList() + .collect().asList() .await().indefinitely()).isInstanceOf(RuntimeException.class).hasMessageContaining("boom"); assertThat(res).hasValue(2); @@ -709,7 +709,7 @@ public void testNullReturnedByAsyncCallback() { } return Uni.createFrom().nullItem(); }) - .collectItems().asList() + .collect().asList() .await().indefinitely()).isInstanceOf(NullPointerException.class).hasMessageContaining("null"); assertThat(res).hasValue(2); } @@ -729,7 +729,7 @@ public void testCallWithSubFailure() { } return Uni.createFrom().nullItem(); }) - .collectItems().asList() + .collect().asList() .await().indefinitely()).isInstanceOf(IllegalStateException.class).hasMessageContaining("boom-2"); assertThat(twoGotCalled).hasValue(23); @@ -756,7 +756,7 @@ public void testInvokeOnItemWithShortcut() { AtomicInteger res = new AtomicInteger(); List r = numbers.invoke(res::set) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(r).containsExactly(1, 2); assertThat(res).hasValue(2); diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiSkipTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiSkipTest.java index b226e043d..1836aafcf 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiSkipTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiSkipTest.java @@ -30,7 +30,7 @@ public void cleanup() { @Test public void testSimpleSkip() { List list = Multi.createFrom().range(1, 5).transform().bySkippingFirstItems(1) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(2, 3, 4); } @@ -38,7 +38,7 @@ public void testSimpleSkip() { @Test public void testSkipZero() { List list = Multi.createFrom().range(1, 5).transform().bySkippingFirstItems(0) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(1, 2, 3, 4); } @@ -46,7 +46,7 @@ public void testSkipZero() { @Test public void testSimpleSkipLast() { List list = Multi.createFrom().range(1, 5).transform().bySkippingLastItems(1) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(1, 2, 3); } @@ -54,7 +54,7 @@ public void testSimpleSkipLast() { @Test public void testSimpleSkipZeroLast() { List list = Multi.createFrom().range(1, 5).transform().bySkippingLastItems(0) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(1, 2, 3, 4); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTakeTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTakeTest.java index 84aa00e65..d6cf8a4ec 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTakeTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTakeTest.java @@ -23,7 +23,7 @@ public class MultiTakeTest { @Test public void testSimpleTake() { List list = Multi.createFrom().range(1, 5).transform().byTakingFirstItems(1) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(1); } @@ -31,7 +31,7 @@ public void testSimpleTake() { @Test public void testTakeZero() { List list = Multi.createFrom().range(1, 5).transform().byTakingFirstItems(0) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).isEmpty(); } @@ -39,7 +39,7 @@ public void testTakeZero() { @Test public void testSimpleTakeLast() { List list = Multi.createFrom().range(1, 5).transform().byTakingLastItems(1) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(4); } @@ -47,7 +47,7 @@ public void testSimpleTakeLast() { @Test public void testSimpleTakeZeroLast() { List list = Multi.createFrom().range(1, 5).transform().byTakingLastItems(0) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).isEmpty(); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformByMergingTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformByMergingTest.java index 050af8876..1c227aa8d 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformByMergingTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformByMergingTest.java @@ -23,7 +23,7 @@ public void testMerging() { Multi m1 = Multi.createFrom().range(1, 10); Multi m2 = Multi.createFrom().range(10, 12); - List list = m1.transform().byMergingWith(m2).collectItems().asList().await().indefinitely(); + List list = m1.transform().byMergingWith(m2).collect().asList().await().indefinitely(); assertThat(list).hasSize(11); } @@ -33,7 +33,7 @@ public void testMergingIterable() { Multi m2 = Multi.createFrom().range(10, 12); Multi m3 = Multi.createFrom().range(12, 14); - List list = m1.transform().byMergingWith(Arrays.asList(m2, m3)).collectItems().asList().await() + List list = m1.transform().byMergingWith(Arrays.asList(m2, m3)).collect().asList().await() .indefinitely(); assertThat(list).hasSize(13); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformToMultiTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformToMultiTest.java index ba7fc19d1..aaf397fae 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformToMultiTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformToMultiTest.java @@ -479,7 +479,7 @@ public void testProduceCompletionStageDeprecated() { List list = Multi.createFrom().range(1, 4) .onItem().produceCompletionStage(i -> CompletableFuture.supplyAsync(() -> i + 1)) .merge() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(3).contains(2, 3, 4); } @@ -491,7 +491,7 @@ public void testProduceCompletionStageRedeemingNullDeprecated() { Multi.createFrom().range(1, 4) .onItem().produceCompletionStage(i -> CompletableFuture.supplyAsync(() -> null)) .merge() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); }).isInstanceOf(NullPointerException.class); } @@ -506,7 +506,7 @@ public void testProduceCompletionStageRedeemingFailureDeprecated() { return cs; }) .merge() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); }).isInstanceOf(IllegalStateException.class) .hasMessage("boom"); } @@ -520,7 +520,7 @@ public void testProduceCompletionStageWithMapperThrowingExceptionDeprecated() { throw new IllegalStateException("boom"); }) .merge() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); }).isInstanceOf(IllegalStateException.class) .hasMessage("boom"); } @@ -534,7 +534,7 @@ public void testProduceCompletionStageWithMapperReturningNullDeprecated() { return null; }) .merge() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); }).isInstanceOf(NullPointerException.class); } @@ -544,7 +544,7 @@ public void testProduceCompletionStageAlternative() { .onItem() .transformToUni(i -> Uni.createFrom().completionStage(CompletableFuture.supplyAsync(() -> i + 1))) .merge() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(3).contains(2, 3, 4); } @@ -555,7 +555,7 @@ public void testProduceIterableDeprecated() { List list = Multi.createFrom().range(1, 4) .onItem().produceIterable(i -> Arrays.asList(i, i + 1)) .merge() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(6).containsExactlyInAnyOrder(1, 2, 2, 3, 3, 4); } @@ -564,7 +564,7 @@ public void testProduceIterableDeprecated() { public void testTransformToIterable() { List list = Multi.createFrom().range(1, 4) .onItem().transformToIterable(i -> Arrays.asList(i, i + 1)) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).hasSize(6).containsExactlyInAnyOrder(1, 2, 2, 3, 3, 4); } @@ -575,7 +575,7 @@ public void testTransformToIterableWithMapperThrowingException() { .onItem(). transformToIterable(i -> { throw new IllegalStateException("boom"); }) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); }) .isInstanceOf(IllegalStateException.class) .hasMessage("boom"); @@ -586,7 +586,7 @@ public void testTransformToIterableWithMapperReturningNull() { assertThatThrownBy(() -> { Multi.createFrom().range(1, 4) .onItem(). transformToIterable(i -> null) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); }) .isInstanceOf(NullPointerException.class); } @@ -596,7 +596,7 @@ public void testProduceIterableWithMapperReturningNullDeprecated() { assertThatThrownBy(() -> { Multi.createFrom().range(1, 4) .onItem(). produceIterable(i -> null).concatenate() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); }) .isInstanceOf(NullPointerException.class); } @@ -932,7 +932,7 @@ public void testMaxConcurrencyNormal() { @RepeatedTest(10) public void testThatConcurrencyDontMissItems() { int max = 10000; - List expected = Multi.createFrom().range(0, max).collectItems().asList().await().indefinitely(); + List expected = Multi.createFrom().range(0, max).collect().asList().await().indefinitely(); AssertSubscriber subscriber = Multi.createFrom().range(0, max) .onItem() .transformToMulti( @@ -949,7 +949,7 @@ public void testThatConcurrencyDontMissItems() { @RepeatedTest(10) public void testThatConcatenateDontMissItemsAndPreserveOrder() { int max = 10000; - List expected = Multi.createFrom().range(0, max).collectItems().asList().await().indefinitely(); + List expected = Multi.createFrom().range(0, max).collect().asList().await().indefinitely(); AssertSubscriber subscriber = Multi.createFrom().range(0, max) .onItem() .transformToMulti( diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformToUniTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformToUniTest.java index ac4ba065d..a1d5664cc 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformToUniTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/MultiTransformToUniTest.java @@ -20,7 +20,7 @@ public void testTransformToUniAndConcatenate() { .onItem() .transformToUni(i -> Uni.createFrom().completionStage(CompletableFuture.supplyAsync(() -> i + 1))) .concatenate() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(2, 3, 4); } @@ -98,7 +98,7 @@ public void testTransformToUniAndConcatenateSingleCall() { List list = Multi.createFrom().range(1, 4) .onItem() .transformToUniAndConcatenate(i -> Uni.createFrom().completionStage(CompletableFuture.supplyAsync(() -> i + 1))) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(2, 3, 4); } @@ -109,7 +109,7 @@ public void testTransformToUniAndMerge() { .onItem() .transformToUni(i -> Uni.createFrom().completionStage(CompletableFuture.supplyAsync(() -> i + 1))) .merge() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactlyInAnyOrder(2, 3, 4); } @@ -178,7 +178,7 @@ public void testTransformToUniAndMergeSingleCall() { List list = Multi.createFrom().range(1, 4) .onItem() .transformToUniAndMerge(i -> Uni.createFrom().completionStage(CompletableFuture.supplyAsync(() -> i + 1))) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactlyInAnyOrder(2, 3, 4); } @@ -192,7 +192,7 @@ public void testTransformToUniAndMergeWithUniOfVoid() { return i; } }))) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactlyInAnyOrder(1, 3, 5); } @@ -208,7 +208,7 @@ public void testTransformToUniAndConcatenateWithUniOfVoid() { return i; } }))) - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(1, 3, 5); } @@ -219,7 +219,7 @@ public void testProduceUniDeprecated() { List list = Multi.createFrom().range(1, 4) .onItem().produceUni(i -> Uni.createFrom().completionStage(CompletableFuture.supplyAsync(() -> i + 1))) .concatenate() - .collectItems().asList().await().indefinitely(); + .collect().asList().await().indefinitely(); assertThat(list).containsExactly(2, 3, 4); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/UniOnItemDisjointTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/UniOnItemDisjointTest.java index c1e4a81f6..af962a50e 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/UniOnItemDisjointTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/UniOnItemDisjointTest.java @@ -25,7 +25,7 @@ public class UniOnItemDisjointTest { public void testDisjointWithArray() { List r = array .onItem(). disjoint() - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(r).containsExactly("a", "b", "c"); } @@ -34,7 +34,7 @@ public void testDisjointWithArray() { public void testDisjointWithEmptyArray() { List r = Uni.createFrom().item(new String[0]) .onItem(). disjoint() - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(r).isEmpty(); } @@ -43,7 +43,7 @@ public void testDisjointWithEmptyArray() { public void testDisjointFromFailure() { assertThatThrownBy(() -> failed .onItem(). disjoint() - .collectItems().asList() + .collect().asList() .await().indefinitely()).hasCauseInstanceOf(IOException.class); } @@ -51,7 +51,7 @@ public void testDisjointFromFailure() { public void testDisjointFromInvalidItemType() { assertThatThrownBy(() -> Uni.createFrom().item("hello") .onItem(). disjoint() - .collectItems().asList() + .collect().asList() .await().indefinitely()).isInstanceOf(IllegalArgumentException.class); } @@ -59,7 +59,7 @@ public void testDisjointFromInvalidItemType() { public void testDisjointFromNull() { List list = Uni.createFrom().nullItem() .onItem(). disjoint() - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(list).isEmpty(); @@ -69,7 +69,7 @@ public void testDisjointFromNull() { public void testDisjointWithPublisher() { List r = Uni.createFrom().item(Flowable.just("a", "b", "c")) .onItem(). disjoint() - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(r).containsExactly("a", "b", "c"); } @@ -78,7 +78,7 @@ public void testDisjointWithPublisher() { public void testDisjointWithEmptyPublisher() { List r = Uni.createFrom().item(Flowable.empty()) .onItem(). disjoint() - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(r).isEmpty(); } @@ -87,7 +87,7 @@ public void testDisjointWithEmptyPublisher() { public void testDisjointWithMulti() { List r = Uni.createFrom().item(Multi.createFrom().items("a", "b", "c")) .onItem(). disjoint() - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(r).containsExactly("a", "b", "c"); } @@ -96,7 +96,7 @@ public void testDisjointWithMulti() { public void testDisjointWithEmptyMulti() { List r = Uni.createFrom().item(Multi.createFrom().empty()) .onItem(). disjoint() - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(r).isEmpty(); } @@ -105,7 +105,7 @@ public void testDisjointWithEmptyMulti() { public void testDisjointWithIterable() { List r = Uni.createFrom().item(Arrays.asList("a", "b", "c")) .onItem(). disjoint() - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(r).containsExactly("a", "b", "c"); } @@ -114,7 +114,7 @@ public void testDisjointWithIterable() { public void testDisjointWithEmptyIterable() { List r = Uni.createFrom().item(Collections.emptyList()) .onItem(). disjoint() - .collectItems().asList() + .collect().asList() .await().indefinitely(); assertThat(r).isEmpty(); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/UniOnNotNullItemTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/UniOnNotNullItemTest.java index be719a5cb..fc680f3eb 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/UniOnNotNullItemTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/UniOnNotNullItemTest.java @@ -235,18 +235,18 @@ public void testProduceCompletionStageDeprecated() { public void testTransformToMulti() { assertThat(Uni.createFrom().item("hello") .onItem().ifNotNull().transformToMulti(x -> Multi.createFrom().item(x.toUpperCase())) - .collectItems().first() + .collect().first() .await().indefinitely()).isEqualTo("HELLO"); assertThat(Uni.createFrom().item(() -> (String) null) .onItem().ifNotNull().transformToMulti(x -> Multi.createFrom().item(x.toUpperCase())) - .collectItems().first() + .collect().first() .onItem().ifNull().continueWith("yolo") .await().indefinitely()).isEqualTo("yolo"); assertThatThrownBy(() -> Uni.createFrom(). failure(new Exception("boom")) .onItem().ifNotNull().transformToMulti(x -> Multi.createFrom().item(x.toUpperCase())) - .collectItems().first() + .collect().first() .onItem().ifNull().continueWith("yolo") .await().indefinitely()).hasMessageContaining("boom"); } @@ -256,18 +256,18 @@ public void testTransformToMulti() { public void testProduceMultiDeprecated() { assertThat(Uni.createFrom().item("hello") .onItem().ifNotNull().produceMulti(x -> Multi.createFrom().item(x.toUpperCase())) - .collectItems().first() + .collect().first() .await().indefinitely()).isEqualTo("HELLO"); assertThat(Uni.createFrom().item(() -> (String) null) .onItem().ifNotNull().produceMulti(x -> Multi.createFrom().item(x.toUpperCase())) - .collectItems().first() + .collect().first() .onItem().ifNull().continueWith("yolo") .await().indefinitely()).isEqualTo("yolo"); assertThatThrownBy(() -> Uni.createFrom(). failure(new Exception("boom")) .onItem().ifNotNull().produceMulti(x -> Multi.createFrom().item(x.toUpperCase())) - .collectItems().first() + .collect().first() .onItem().ifNull().continueWith("yolo") .await().indefinitely()).hasMessageContaining("boom"); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/UniRepeatTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/UniRepeatTest.java index 2b8d8e094..963ce1cfb 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/UniRepeatTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/UniRepeatTest.java @@ -29,7 +29,7 @@ public class UniRepeatTest { public void testRepeatAtMost() { List list = Uni.createFrom().item(1) .repeat().atMost(3) - .collectItems().asList() + .collect().asList() .await().atMost(Duration.ofSeconds(5)); assertThat(list).hasSize(3).contains(1, 1, 1); } @@ -40,7 +40,7 @@ public void testRepeatUntil() { Iterator iterator = items.iterator(); List list = Uni.createFrom().item(iterator::next) .repeat().until(v -> v.equalsIgnoreCase("d")) - .collectItems().asList() + .collect().asList() .await().atMost(Duration.ofSeconds(5)); assertThat(list).hasSize(3).contains("a", "b", "c"); } @@ -67,7 +67,7 @@ public void testRepeatWhilst() { public void testRepeat0() { assertThrows(IllegalArgumentException.class, () -> Uni.createFrom().item(0) .repeat().atMost(0) - .collectItems().asList() + .collect().asList() .await().indefinitely()); } @@ -75,7 +75,7 @@ public void testRepeat0() { public void testRepeatUntilWithNullPredicate() { assertThrows(IllegalArgumentException.class, () -> Uni.createFrom().item(0) .repeat().until(null) - .collectItems().asList() + .collect().asList() .await().indefinitely()); } @@ -83,7 +83,7 @@ public void testRepeatUntilWithNullPredicate() { public void testRepeatWhilstWithNullPredicate() { assertThrows(IllegalArgumentException.class, () -> Uni.createFrom().item(0) .repeat().whilst(null) - .collectItems().asList() + .collect().asList() .await().indefinitely()); } @@ -92,7 +92,7 @@ public void testRepeat1() { AtomicInteger count = new AtomicInteger(); List list = Uni.createFrom().item(count::getAndIncrement) .repeat().atMost(1) - .collectItems().asList() + .collect().asList() .await().atMost(Duration.ofSeconds(5)); assertThat(list).containsExactly(0); @@ -105,7 +105,7 @@ public void testRepeatUntilOnlyOnce() { AtomicBoolean once = new AtomicBoolean(); List list = Uni.createFrom().item(count::getAndIncrement) .repeat().until(x -> once.getAndSet(true)) - .collectItems().asList() + .collect().asList() .await().atMost(Duration.ofSeconds(5)); assertThat(list).containsExactly(0); @@ -118,7 +118,7 @@ public void testRepeatWhilstOnlyOnce() { AtomicBoolean once = new AtomicBoolean(true); List list = Uni.createFrom().item(count::getAndIncrement) .repeat().whilst(x -> once.getAndSet(false)) - .collectItems().asList() + .collect().asList() .await().atMost(Duration.ofSeconds(5)); assertThat(list).containsExactly(0, 1); @@ -130,7 +130,7 @@ public void testNoRepeatUntil() { AtomicInteger count = new AtomicInteger(); List list = Uni.createFrom().item(count::getAndIncrement) .repeat().until(x -> true) - .collectItems().asList() + .collect().asList() .await().atMost(Duration.ofSeconds(5)); assertThat(list).isEmpty(); @@ -142,7 +142,7 @@ public void testNoRepeatWhilst() { AtomicInteger count = new AtomicInteger(); List list = Uni.createFrom().item(count::getAndIncrement) .repeat().whilst(x -> false) - .collectItems().asList() + .collect().asList() .await().atMost(Duration.ofSeconds(5)); assertThat(list).containsExactly(0); @@ -157,7 +157,7 @@ public void testRepeatCancelledWithTake() { .repeat().indefinitely() .runSubscriptionOn(Infrastructure.getDefaultWorkerPool()) .transform().byTakingFirstItems(num) - .collectItems().last() + .collect().last() .await().atMost(Duration.ofSeconds(5)); assertThat(num).isEqualTo(value); assertThat(count).hasValue(value); @@ -175,7 +175,7 @@ public void testRepeatUntilCancelledWithTake() { }) .runSubscriptionOn(Infrastructure.getDefaultWorkerPool()) .transform().byTakingFirstItems(num) - .collectItems().last() + .collect().last() .await().atMost(Duration.ofSeconds(5)); assertThat(num).isEqualTo(value); assertThat(count).hasValue(value); @@ -194,7 +194,7 @@ public void testRepeatWhilstCancelledWithTake() { }) .runSubscriptionOn(Infrastructure.getDefaultWorkerPool()) .transform().byTakingFirstItems(num) - .collectItems().last() + .collect().last() .await().atMost(Duration.ofSeconds(5)); assertThat(num).isEqualTo(value); assertThat(count).hasValue(value); @@ -206,7 +206,7 @@ public void testNoStackOverflow() { int value = Uni.createFrom().item(1).repeat().indefinitely() .runSubscriptionOn(Infrastructure.getDefaultWorkerPool()) .transform().byTakingFirstItems(100000L) - .collectItems().last() + .collect().last() .await().atMost(Duration.ofSeconds(5)); assertThat(value).isEqualTo(1); } @@ -217,7 +217,7 @@ public void testNoStackOverflowWithRepeatUntil() { int value = Uni.createFrom().item(1).repeat().until(x -> count.incrementAndGet() > 100000000L) .runSubscriptionOn(Infrastructure.getDefaultWorkerPool()) .transform().byTakingFirstItems(100000L) - .collectItems().last() + .collect().last() .await().atMost(Duration.ofSeconds(5)); assertThat(value).isEqualTo(1); } @@ -228,7 +228,7 @@ public void testNoStackOverflowWithRepeatWhilst() { int value = Uni.createFrom().item(1).repeat().whilst(x -> count.incrementAndGet() < 100000000L) .runSubscriptionOn(Infrastructure.getDefaultWorkerPool()) .transform().byTakingFirstItems(100000L) - .collectItems().last() + .collect().last() .await().atMost(Duration.ofSeconds(5)); assertThat(value).isEqualTo(1); } @@ -624,7 +624,7 @@ public void testRepetitionWithState() { () -> new AtomicInteger(0), (s, e) -> e.complete(s.getAndIncrement())) .repeat().atMost(3) - .collectItems().asList() + .collect().asList() .await().atMost(Duration.ofSeconds(5)); assertThat(list).containsExactly(0, 1, 2); } diff --git a/implementation/src/test/java/io/smallrye/mutiny/operators/UniToPublisherTest.java b/implementation/src/test/java/io/smallrye/mutiny/operators/UniToPublisherTest.java index c6cfd3972..fe511bbc2 100644 --- a/implementation/src/test/java/io/smallrye/mutiny/operators/UniToPublisherTest.java +++ b/implementation/src/test/java/io/smallrye/mutiny/operators/UniToPublisherTest.java @@ -218,6 +218,6 @@ public void testWithAsyncFailure() { public void testUniOfVoid() { Uni uni = Uni.createFrom().voidItem(); Multi publisher = uni.toMulti(); - assertThat(publisher.collectItems().asList().await().indefinitely()).isEmpty(); + assertThat(publisher.collect().asList().await().indefinitely()).isEmpty(); } } diff --git a/implementation/src/test/java/tck/MultiCollectTest.java b/implementation/src/test/java/tck/MultiCollectTest.java index a0402383a..ccc6b4bc3 100644 --- a/implementation/src/test/java/tck/MultiCollectTest.java +++ b/implementation/src/test/java/tck/MultiCollectTest.java @@ -22,21 +22,21 @@ public class MultiCollectTest extends AbstractTck { @Test public void toListStageShouldReturnAList() { List list = await( - Multi.createFrom().items(1, 2, 3).collectItems().asList().subscribeAsCompletionStage()); + Multi.createFrom().items(1, 2, 3).collect().asList().subscribeAsCompletionStage()); assertEquals(list, Arrays.asList(1, 2, 3)); } @Test public void toListStageShouldReturnEmpty() { assertEquals( - await(Multi.createFrom().items().collectItems().asList().subscribeAsCompletionStage()), + await(Multi.createFrom().items().collect().asList().subscribeAsCompletionStage()), Collections.emptyList()); } @Test public void collectShouldAccumulateResult() { CompletableFuture future = Multi.createFrom().items(1, 2, 3) - .collectItems().in( + .collect().in( () -> new AtomicInteger(0), AtomicInteger::addAndGet) .subscribeAsCompletionStage(); @@ -45,7 +45,7 @@ public void collectShouldAccumulateResult() { @Test public void collectShouldSupportEmptyStreams() { - CompletableFuture future = Multi.createFrom(). empty().collectItems().in( + CompletableFuture future = Multi.createFrom(). empty().collect().in( () -> new AtomicInteger(42), AtomicInteger::addAndGet) .subscribeAsCompletionStage(); @@ -56,7 +56,7 @@ public void collectShouldSupportEmptyStreams() { public void collectShouldPropagateUpstreamErrors() { assertThrows(QuietRuntimeException.class, () -> await(Multi.createFrom() . failure(new QuietRuntimeException("failed")) - .collectItems().in( + .collect().in( () -> new AtomicInteger(0), AtomicInteger::addAndGet) .subscribeAsCompletionStage())); @@ -65,14 +65,14 @@ public void collectShouldPropagateUpstreamErrors() { @Test public void finisherFunctionShouldBeInvoked() { assertEquals(await(Multi.createFrom().items("1", "2", "3") - .collectItems().with(Collectors.joining(", ")).subscribeAsCompletionStage()), "1, 2, 3"); + .collect().with(Collectors.joining(", ")).subscribeAsCompletionStage()), "1, 2, 3"); } @Test public void toListStageShouldPropagateUpstreamErrors() { assertThrows(QuietRuntimeException.class, () -> await(Multi.createFrom() .failure(new QuietRuntimeException("failed")) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } @@ -88,7 +88,7 @@ public void collectStageShouldPropagateErrorsFromSupplierThroughCompletionStage( cancelled.complete(null); } }) - .collectItems().with(Collector. of(() -> { + .collect().with(Collector. of(() -> { throw new QuietRuntimeException("failed"); }, (a, b) -> { }, Integer::sum, Function.identity())) @@ -109,7 +109,7 @@ public void collectStageShouldPropagateErrorsFromAccumulator() { CompletionStage result = infiniteStream() .onTermination().invoke(() -> cancelled.complete(null)) - .collectItems().with(Collector.of(() -> "", (a, b) -> { + .collect().with(Collector.of(() -> "", (a, b) -> { throw new QuietRuntimeException("failed"); }, (a, b) -> a + b, Function.identity())) .subscribeAsCompletionStage(); @@ -122,7 +122,7 @@ public void collectStageShouldPropagateErrorsFromAccumulator() { public void collectStageShouldPropagateErrorsFromFinisher() { assertThrows(QuietRuntimeException.class, () -> { CompletionStage result = Multi.createFrom().items(1, 2, 3) - .collectItems().with(Collector. of(() -> 0, (a, b) -> { + .collect().with(Collector. of(() -> 0, (a, b) -> { }, Integer::sum, r -> { diff --git a/implementation/src/test/java/tck/MultiConcatTckTest.java b/implementation/src/test/java/tck/MultiConcatTckTest.java index af3498432..ed8171040 100644 --- a/implementation/src/test/java/tck/MultiConcatTckTest.java +++ b/implementation/src/test/java/tck/MultiConcatTckTest.java @@ -20,7 +20,7 @@ public void concatStageShouldConcatTwoGraphs() { Multi.createBy().concatenating().streams( Multi.createFrom().items(1, 2, 3), Multi.createFrom().items(4, 5, 6)) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2, 3, 4, 5, 6)); } @@ -30,7 +30,7 @@ public void concatStageShouldPropagateExceptionsFromSecondStage() { assertThrows(QuietRuntimeException.class, () -> await( Multi.createBy().concatenating().streams( Multi.createFrom().items(1, 2, 3), - Multi.createFrom().failure(new QuietRuntimeException("failed"))).collectItems().asList() + Multi.createFrom().failure(new QuietRuntimeException("failed"))).collect().asList() .subscribeAsCompletionStage())); } @@ -40,7 +40,7 @@ public void concatStageShouldWorkWithEmptyFirstGraph() { Multi.createBy().concatenating().streams( Multi.createFrom().empty(), Multi.createFrom().items(1, 2, 3)) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2, 3)); } @@ -51,7 +51,7 @@ public void concatStageShouldWorkWithEmptySecondGraph() { Multi.createBy().concatenating().streams( Multi.createFrom().items(1, 2, 3), Multi.createFrom().empty()) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2, 3)); } @@ -62,7 +62,7 @@ public void concatStageShouldWorkWithBothGraphsEmpty() { Multi.createBy().concatenating().streams( Multi.createFrom().empty(), Multi.createFrom().empty()) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Collections.emptyList()); } @@ -77,7 +77,7 @@ public void concatStageShouldSupportNestedConcats() { Multi.createBy().concatenating().streams( Multi.createFrom().items(7, 8, 9), Multi.createFrom().items(10, 11, 12))) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)); } diff --git a/implementation/src/test/java/tck/MultiDistinctTckTest.java b/implementation/src/test/java/tck/MultiDistinctTckTest.java index 76b05f074..c73c8c164 100644 --- a/implementation/src/test/java/tck/MultiDistinctTckTest.java +++ b/implementation/src/test/java/tck/MultiDistinctTckTest.java @@ -22,7 +22,7 @@ public void distinctStageShouldReturnDistinctElements() { assertEquals(await( Multi.createFrom().items(1, 2, 2, 3, 2, 1, 3) .transform().byDroppingDuplicates() - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2, 3)); } @@ -31,7 +31,7 @@ public void distinctStageShouldReturnDistinctElements() { public void distinctStageShouldReturnAnEmptyStreamWhenCalledOnEmptyStreams() { assertEquals(await(Multi.createFrom().empty() .transform().byDroppingDuplicates() - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Collections.emptyList()); } @@ -40,7 +40,7 @@ public void distinctStageShouldPropagateUpstreamExceptions() { assertThrows(QuietRuntimeException.class, () -> await(Multi.createFrom().failure(new QuietRuntimeException("failed")) .transform().byDroppingDuplicates() - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } @@ -62,7 +62,7 @@ public boolean equals(Object obj) { CompletionStage> result = Multi.createFrom().items( new ObjectThatThrowsFromEquals(), new ObjectThatThrowsFromEquals()) .onTermination().invoke(() -> cancelled.complete(null)) - .transform().byDroppingDuplicates().collectItems().asList().subscribeAsCompletionStage(); + .transform().byDroppingDuplicates().collect().asList().subscribeAsCompletionStage(); await(cancelled); await(result); }); diff --git a/implementation/src/test/java/tck/MultiFirstTckTest.java b/implementation/src/test/java/tck/MultiFirstTckTest.java index c746028af..686cd27d4 100644 --- a/implementation/src/test/java/tck/MultiFirstTckTest.java +++ b/implementation/src/test/java/tck/MultiFirstTckTest.java @@ -14,7 +14,7 @@ public class MultiFirstTckTest extends AbstractTck { public void findFirstStageShouldFindTheFirstElement() { int res = await( Multi.createFrom().items(1, 2, 3) - .collectItems().first() + .collect().first() .subscribeAsCompletionStage()); assertEquals(res, 1); } @@ -22,14 +22,14 @@ public void findFirstStageShouldFindTheFirstElement() { @Test public void findFirstStageShouldFindTheFirstElementInSingleElementStream() { int result = await(Multi.createFrom().item(1) - .collectItems().first().subscribeAsCompletionStage()); + .collect().first().subscribeAsCompletionStage()); assertEquals(result, 1); } @Test public void findFirstStageShouldReturnEmptyForEmptyStream() { assertNull(await(Multi.createFrom().items() - .collectItems().first().subscribeAsCompletionStage())); + .collect().first().subscribeAsCompletionStage())); } @Test @@ -37,7 +37,7 @@ public void findFirstStageShouldCancelUpstream() { CompletableFuture cancelled = new CompletableFuture<>(); int result = await(infiniteStream() .onTermination().invoke(() -> cancelled.complete(null)) - .collectItems().first().subscribeAsCompletionStage()); + .collect().first().subscribeAsCompletionStage()); assertEquals(result, 1); await(cancelled); } @@ -46,13 +46,13 @@ public void findFirstStageShouldCancelUpstream() { public void findFirstStageShouldPropagateErrors() { assertThrows(QuietRuntimeException.class, () -> await(Multi.createFrom().failure(new QuietRuntimeException("failed")) - .collectItems().first().subscribeAsCompletionStage())); + .collect().first().subscribeAsCompletionStage())); } @Test public void findFirstStageShouldBeReusable() { int result = await(Multi.createFrom().items(1, 2, 3) - .collectItems().first().subscribeAsCompletionStage()); + .collect().first().subscribeAsCompletionStage()); assertEquals(result, 1); } } diff --git a/implementation/src/test/java/tck/MultiFlatMapCompletionStageTckTest.java b/implementation/src/test/java/tck/MultiFlatMapCompletionStageTckTest.java index 9f20c6f4e..f62874624 100644 --- a/implementation/src/test/java/tck/MultiFlatMapCompletionStageTckTest.java +++ b/implementation/src/test/java/tck/MultiFlatMapCompletionStageTckTest.java @@ -25,7 +25,7 @@ public void flatMapCsStageShouldMapFutures() { CompletableFuture three = new CompletableFuture<>(); CompletionStage> result = Multi.createFrom().> items(one, two, three) .onItem().transformToUni(i -> Uni.createFrom().completionStage(i)).merge() - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); one.complete(1); two.complete(2); @@ -56,7 +56,7 @@ public void flatMapCsStageShouldMaintainOrderOfFuturesIfConcurrencyIs1() throws CompletableFuture three = new CompletableFuture<>(); CompletionStage> result = Multi.createFrom().> items(one, two, three) .onItem().transformToUni(i -> Uni.createFrom().completionStage(i)).merge(1) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); three.complete(3); Thread.sleep(100L); //NOSONAR @@ -77,7 +77,7 @@ public void flatMapCsStageShouldOnlyMapOneElementAtATimeWithConcurrencyIs1() thr assertEquals(1, concurrentMaps.incrementAndGet()); return Uni.createFrom().completionStage(cs); }).merge(1) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); Thread.sleep(100L); // NOSONAR concurrentMaps.decrementAndGet(); @@ -98,7 +98,7 @@ public void flatMapCsStageShouldPropagateUpstreamErrors() { .onItem().transformToUni( i -> Uni.createFrom().completionStage(CompletableFuture.completedFuture(i))) .merge() - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } @@ -111,7 +111,7 @@ public void flatMapCsStageShouldHandleErrorsThrownByCallback() { .onItem().transformToUni(i -> { throw new QuietRuntimeException("failed"); }).merge() - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); @@ -129,7 +129,7 @@ public void flatMapCsStageShouldHandleFailedCompletionStages() { failed.completeExceptionally(new QuietRuntimeException("failed")); return Uni.createFrom().completionStage(failed); }).merge() - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); @@ -146,7 +146,7 @@ public void flatMapCsStageShouldFailIfNullIsReturned() { .transformToUni(i -> Uni.createFrom().completionStage(CompletableFuture.completedFuture(null)) .onItem().ifNull().failWith(new NullPointerException())) .merge() - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); diff --git a/implementation/src/test/java/tck/MultiFlatMapTckTest.java b/implementation/src/test/java/tck/MultiFlatMapTckTest.java index 9a28376e4..9a52b315d 100644 --- a/implementation/src/test/java/tck/MultiFlatMapTckTest.java +++ b/implementation/src/test/java/tck/MultiFlatMapTckTest.java @@ -41,7 +41,7 @@ public void flatMapStageShouldMapElements() { assertEquals(await(Multi.createFrom().items(1, 2, 3) .emitOn(executor) .flatMap(n -> Multi.createFrom().items(n, n, n)) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 3)); } @@ -49,7 +49,7 @@ public void flatMapStageShouldMapElements() { public void flatMapStageShouldAllowEmptySubStreams() { assertEquals(await(Multi.createFrom().items(Multi.createFrom().empty(), Multi.createFrom().items(1, 2)) .flatMap(Function.identity()) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2)); } @@ -66,7 +66,7 @@ public void flatMapStageShouldHandleExceptions() { .flatMap(foo -> { throw new QuietRuntimeException("failed"); }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); @@ -78,7 +78,7 @@ public void flatMapStageShouldPropagateUpstreamExceptions() { assertThrows(QuietRuntimeException.class, () -> await(Multi.createFrom().failure(new QuietRuntimeException("failed")) .flatMap(x -> Multi.createFrom().item(x)) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } @@ -89,7 +89,7 @@ public void flatMapStageShouldPropagateSubstreamExceptions() { CompletionStage> result = infiniteStream() .onTermination().invoke(() -> cancelled.complete(null)) .flatMap(f -> Multi.createFrom().failure(new QuietRuntimeException("failed"))) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); @@ -103,7 +103,7 @@ public void concatMapStageShouldOnlySubscribeToOnePublisherAtATime() throws Exce CompletionStage> result = Multi.createFrom().items(1, 2, 3, 4, 5) .concatMap(id -> Multi.createFrom() .publisher(new ScheduledPublisher(id, activePublishers, this::getExecutor))) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); assertEquals(result.toCompletableFuture().get(2, TimeUnit.SECONDS), @@ -118,7 +118,7 @@ public void flatMapStageShouldPropagateCancelToSubstreams() { .onTermination().invoke(() -> outerCancelled.complete(null)) .flatMap(i -> infiniteStream().onTermination().invoke(() -> innerCancelled.complete(null))) .transform().byTakingFirstItems(5) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()); await(outerCancelled); diff --git a/implementation/src/test/java/tck/MultiOnFailureResumeTest.java b/implementation/src/test/java/tck/MultiOnFailureResumeTest.java index 76d3f0e3c..aec57c044 100644 --- a/implementation/src/test/java/tck/MultiOnFailureResumeTest.java +++ b/implementation/src/test/java/tck/MultiOnFailureResumeTest.java @@ -25,7 +25,7 @@ public void onErrorResumeShouldCatchErrorFromSource() { exception.set(err); return "foo"; }) - .collectItems().asList(); + .collect().asList(); assertEquals(await(uni.subscribeAsCompletionStage()), Collections.singletonList("foo")); assertEquals(exception.get().getMessage(), "failed"); } @@ -38,7 +38,7 @@ public void onErrorResumeWithShouldCatchErrorFromSource() { exception.set(err); return Multi.createFrom().items("foo", "bar"); }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList("foo", "bar")); assertEquals(exception.get().getMessage(), "failed"); } @@ -57,7 +57,7 @@ public void onErrorResumeShouldCatchErrorFromStage() { exception.set(err); return "foo"; }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList("A", "foo")); assertEquals(exception.get().getMessage(), "failed"); } @@ -76,7 +76,7 @@ public void onErrorResumeWithShouldCatchErrorFromStage() { exception.set(err); return Multi.createFrom().items("foo", "bar"); }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList("A", "foo", "bar")); assertEquals(exception.get().getMessage(), "failed"); } @@ -88,7 +88,7 @@ public void onErrorResumeStageShouldPropagateRuntimeExceptions() { .onFailure().recoverWithMulti(t -> { throw new QuietRuntimeException("failed"); }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } @@ -99,7 +99,7 @@ public void onErrorResumeWithStageShouldPropagateRuntimeExceptions() { .onFailure().recoverWithItem(t -> { throw new QuietRuntimeException("failed"); }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } @@ -109,7 +109,7 @@ public void onErrorResumeWithShouldBeAbleToInjectAFailure() { () -> await(Multi.createFrom(). failure(new QuietRuntimeException("failed")) .onFailure() .recoverWithMulti(err -> Multi.createFrom().failure(new QuietRuntimeException("boom"))) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } } diff --git a/implementation/src/test/java/tck/MultiOnITemTransformToMultiAndConcatenateTckTest.java b/implementation/src/test/java/tck/MultiOnITemTransformToMultiAndConcatenateTckTest.java index a76ed65cb..aac4ac765 100644 --- a/implementation/src/test/java/tck/MultiOnITemTransformToMultiAndConcatenateTckTest.java +++ b/implementation/src/test/java/tck/MultiOnITemTransformToMultiAndConcatenateTckTest.java @@ -42,7 +42,7 @@ public void flatMapStageShouldMapElements() { assertEquals(await(Multi.createFrom().items(1, 2, 3) .emitOn(executor) .onItem().transformToMultiAndConcatenate(n -> Multi.createFrom().items(n, n, n)) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 3)); } @@ -50,7 +50,7 @@ public void flatMapStageShouldMapElements() { public void flatMapStageShouldAllowEmptySubStreams() { assertEquals(await(Multi.createFrom().items(Multi.createFrom().empty(), Multi.createFrom().items(1, 2)) .onItem().transformToMultiAndConcatenate(Function.identity()) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2)); } @@ -67,7 +67,7 @@ public void flatMapStageShouldHandleExceptions() { .onItem().transformToMultiAndConcatenate(foo -> { throw new QuietRuntimeException("failed"); }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); @@ -79,7 +79,7 @@ public void flatMapStageShouldPropagateUpstreamExceptions() { assertThrows(QuietRuntimeException.class, () -> await(Multi.createFrom().failure(new QuietRuntimeException("failed")) .onItem().transformToMultiAndConcatenate(x -> Multi.createFrom().item(x)) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } @@ -92,7 +92,7 @@ public void flatMapStageShouldPropagateSubstreamExceptions() { .onItem() .transformToMultiAndConcatenate( f -> Multi.createFrom().failure(new QuietRuntimeException("failed"))) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); @@ -109,7 +109,7 @@ public void flatMapStageShouldPropagateCancelToSubstreams() { .transformToMultiAndConcatenate( i -> infiniteStream().onTermination().invoke(() -> innerCancelled.complete(null))) .transform().byTakingFirstItems(5) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()); await(outerCancelled); diff --git a/implementation/src/test/java/tck/MultiOnITemTransformToMultiAndMergeTckTest.java b/implementation/src/test/java/tck/MultiOnITemTransformToMultiAndMergeTckTest.java index 15380ee2a..5060a9298 100644 --- a/implementation/src/test/java/tck/MultiOnITemTransformToMultiAndMergeTckTest.java +++ b/implementation/src/test/java/tck/MultiOnITemTransformToMultiAndMergeTckTest.java @@ -42,7 +42,7 @@ public void flatMapStageShouldMapElements() { assertEquals(await(Multi.createFrom().items(1, 2, 3) .emitOn(executor) .onItem().transformToMultiAndMerge(n -> Multi.createFrom().items(n, n, n)) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 3)); } @@ -50,7 +50,7 @@ public void flatMapStageShouldMapElements() { public void flatMapStageShouldAllowEmptySubStreams() { assertEquals(await(Multi.createFrom().items(Multi.createFrom().empty(), Multi.createFrom().items(1, 2)) .onItem().transformToMultiAndMerge(Function.identity()) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2)); } @@ -67,7 +67,7 @@ public void flatMapStageShouldHandleExceptions() { .onItem().transformToMultiAndMerge(foo -> { throw new QuietRuntimeException("failed"); }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); @@ -79,7 +79,7 @@ public void flatMapStageShouldPropagateUpstreamExceptions() { assertThrows(QuietRuntimeException.class, () -> await(Multi.createFrom().failure(new QuietRuntimeException("failed")) .onItem().transformToMultiAndMerge(x -> Multi.createFrom().item(x)) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } @@ -91,7 +91,7 @@ public void flatMapStageShouldPropagateSubstreamExceptions() { .onTermination().invoke(() -> cancelled.complete(null)) .onItem() .transformToMultiAndMerge(f -> Multi.createFrom().failure(new QuietRuntimeException("failed"))) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); @@ -107,7 +107,7 @@ public void flatMapStageShouldPropagateCancelToSubstreams() { .onItem().transformToMultiAndMerge(i -> infiniteStream().onTermination() .invoke(() -> innerCancelled.complete(null))) .transform().byTakingFirstItems(5) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()); await(outerCancelled); diff --git a/implementation/src/test/java/tck/MultiOnItemTransformTckTest.java b/implementation/src/test/java/tck/MultiOnItemTransformTckTest.java index 8ca26fbb5..e40a7c6d2 100644 --- a/implementation/src/test/java/tck/MultiOnItemTransformTckTest.java +++ b/implementation/src/test/java/tck/MultiOnItemTransformTckTest.java @@ -21,7 +21,7 @@ public class MultiOnItemTransformTckTest extends AbstractPublisherTck { public void mapStageShouldMapElements() { assertEquals(await(Multi.createFrom().items(1, 2, 3) .map(Object::toString) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList("1", "2", "3")); } @@ -34,7 +34,7 @@ public void mapStageShouldHandleExceptions() { .map(foo -> { throw new QuietRuntimeException("failed"); }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); @@ -46,7 +46,7 @@ public void mapStageShouldPropagateUpstreamExceptions() { assertThrows(QuietRuntimeException.class, () -> await(Multi.createFrom().failure(new QuietRuntimeException("failed")) .map(Function.identity()) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } @@ -57,7 +57,7 @@ public void mapStageShouldFailIfNullReturned() { CompletionStage> result = infiniteStream() .onTermination().invoke(() -> cancelled.complete(null)) .map(t -> null) - .collectItems().asList().subscribeAsCompletionStage(); + .collect().asList().subscribeAsCompletionStage(); await(cancelled); await(result); }); diff --git a/implementation/src/test/java/tck/MultiSkipItemsWhileTckTest.java b/implementation/src/test/java/tck/MultiSkipItemsWhileTckTest.java index 0a6ca7c89..39ecaf77d 100644 --- a/implementation/src/test/java/tck/MultiSkipItemsWhileTckTest.java +++ b/implementation/src/test/java/tck/MultiSkipItemsWhileTckTest.java @@ -22,7 +22,7 @@ public class MultiSkipItemsWhileTckTest extends AbstractPublisherTck { public void dropWhileStageShouldSupportDroppingElements() { assertEquals(await(Multi.createFrom().items(1, 2, 3, 4, 0) .transform().bySkippingItemsWhile(i -> i < 3) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(3, 4, 0)); } @@ -35,7 +35,7 @@ public void dropWhileStageShouldHandleErrors() { .transform().bySkippingItemsWhile(i -> { throw new QuietRuntimeException("failed"); }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); @@ -47,7 +47,7 @@ public void dropWhileStageShouldPropagateUpstreamErrorsWhileDropping() { assertThrows(QuietRuntimeException.class, () -> await(Multi.createFrom(). failure(new QuietRuntimeException("failed")) .transform().bySkippingItemsWhile(i -> i < 3) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } @@ -60,7 +60,7 @@ public void dropWhileStageShouldPropagateUpstreamErrorsAfterFinishedDropping() { } }) .transform().bySkippingItemsWhile(i -> i < 3) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage())); } @@ -76,7 +76,7 @@ public void dropWhileStageShouldNotRunPredicateOnceItsFinishedDropping() { return false; } }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(3, 4)); } @@ -84,7 +84,7 @@ public void dropWhileStageShouldNotRunPredicateOnceItsFinishedDropping() { public void dropWhileStageShouldAllowCompletionWhileDropping() { assertEquals(await(Multi.createFrom().items(1, 1, 1, 1) .transform().bySkippingItemsWhile(i -> i < 3) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Collections.emptyList()); } diff --git a/implementation/src/test/java/tck/MultiTakeFirstItemsTckTest.java b/implementation/src/test/java/tck/MultiTakeFirstItemsTckTest.java index 947f69f77..7a0bfcb35 100644 --- a/implementation/src/test/java/tck/MultiTakeFirstItemsTckTest.java +++ b/implementation/src/test/java/tck/MultiTakeFirstItemsTckTest.java @@ -19,7 +19,7 @@ public class MultiTakeFirstItemsTckTest extends AbstractPublisherTck { public void limitStageShouldLimitTheOutputElements() { assertEquals(await(infiniteStream() .transform().byTakingFirstItems(3) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2, 3)); } @@ -27,7 +27,7 @@ public void limitStageShouldLimitTheOutputElements() { public void limitStageShouldAllowLimitingToZero() { assertEquals(await(infiniteStream() .transform().byTakingFirstItems(0) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Collections.emptyList()); } @@ -42,7 +42,7 @@ public void request(long n) { public void cancel() { } })).transform().byTakingFirstItems(0) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Collections.emptyList()); } @@ -52,7 +52,7 @@ public void limitStageShouldCancelUpStreamWhenDone() { infiniteStream() .onTermination().invoke(() -> cancelled.complete(null)) .transform().byTakingFirstItems(1) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); } @@ -69,7 +69,7 @@ public void limitStageShouldIgnoreSubsequentErrorsWhenDone() { } }) .transform().byTakingFirstItems(3) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2, 3)); } @@ -87,7 +87,7 @@ public void limitStageShouldPropagateCancellation() { }) .transform().byTakingFirstItems(100) .transform().byTakingFirstItems(3) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()); await(cancelled); } diff --git a/implementation/src/test/java/tck/MultiTakeItemsWhileTckTest.java b/implementation/src/test/java/tck/MultiTakeItemsWhileTckTest.java index 9d396040c..16f0b4c34 100644 --- a/implementation/src/test/java/tck/MultiTakeItemsWhileTckTest.java +++ b/implementation/src/test/java/tck/MultiTakeItemsWhileTckTest.java @@ -21,7 +21,7 @@ public class MultiTakeItemsWhileTckTest extends AbstractPublisherTck { public void takeWhileStageShouldTakeWhileConditionIsTrue() { assertEquals(await(Multi.createFrom().items(1, 2, 3, 4, 5, 6, 1, 2) .transform().byTakingItemsWhile(i -> i < 5) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2, 3, 4)); } @@ -29,7 +29,7 @@ public void takeWhileStageShouldTakeWhileConditionIsTrue() { public void takeWhileStageShouldEmitEmpty() { assertEquals(await(Multi.createFrom().items(1, 2, 3, 4, 5, 6) .transform().byTakingItemsWhile(i -> false) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Collections.emptyList()); } @@ -39,7 +39,7 @@ public void takeWhileShouldCancelUpStreamWhenDone() { infiniteStream() .onTermination().invoke(() -> cancelled.complete(null)) .transform().byTakingItemsWhile(t -> false) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); } @@ -56,7 +56,7 @@ public void takeWhileShouldIgnoreSubsequentErrorsWhenDone() { } }) .transform().byTakingItemsWhile(t -> t < 3) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage()), Arrays.asList(1, 2)); } @@ -70,7 +70,7 @@ public void takeWhileStageShouldHandleErrors() { .transform().byTakingItemsWhile(i -> { throw new QuietRuntimeException("failed"); }) - .collectItems().asList() + .collect().asList() .subscribeAsCompletionStage(); await(cancelled); await(result); diff --git a/reactive-streams-operators/src/main/java/io/smallrye/mutiny/streams/stages/CollectStageFactory.java b/reactive-streams-operators/src/main/java/io/smallrye/mutiny/streams/stages/CollectStageFactory.java index 3b6a8de0c..025d8bd6f 100644 --- a/reactive-streams-operators/src/main/java/io/smallrye/mutiny/streams/stages/CollectStageFactory.java +++ b/reactive-streams-operators/src/main/java/io/smallrye/mutiny/streams/stages/CollectStageFactory.java @@ -37,7 +37,7 @@ private static class CollectStage implements TerminalStage { @Override public CompletionStage apply(Multi source) { - return source.collectItems().with(collector).subscribeAsCompletionStage(); + return source.collect().with(collector).subscribeAsCompletionStage(); } } diff --git a/reactive-streams-operators/src/main/java/io/smallrye/mutiny/streams/stages/FindFirstStageFactory.java b/reactive-streams-operators/src/main/java/io/smallrye/mutiny/streams/stages/FindFirstStageFactory.java index c30a908c7..d98ca5996 100644 --- a/reactive-streams-operators/src/main/java/io/smallrye/mutiny/streams/stages/FindFirstStageFactory.java +++ b/reactive-streams-operators/src/main/java/io/smallrye/mutiny/streams/stages/FindFirstStageFactory.java @@ -20,7 +20,7 @@ public class FindFirstStageFactory implements TerminalStageFactory> INSTANCE = source -> { CompletableFuture> future = new CompletableFuture<>(); source - .collectItems().first() + .collect().first() .subscribe().with( item -> future.complete(Optional.ofNullable(item)), future::completeExceptionally); diff --git a/rxjava/src/main/java/io/smallrye/mutiny/converters/multi/ToSingle.java b/rxjava/src/main/java/io/smallrye/mutiny/converters/multi/ToSingle.java index 8df8b131d..26ed77967 100644 --- a/rxjava/src/main/java/io/smallrye/mutiny/converters/multi/ToSingle.java +++ b/rxjava/src/main/java/io/smallrye/mutiny/converters/multi/ToSingle.java @@ -9,6 +9,7 @@ import io.smallrye.mutiny.converters.uni.UniRxConverters; public class ToSingle implements Function, Single>> { + @SuppressWarnings("rawtypes") public static final ToSingle INSTANCE = new ToSingle(); private ToSingle() { @@ -21,7 +22,7 @@ public ToSingleFailOnNull onEmptyThrow(Supplier supp @Override public Single> apply(Multi multi) { - return multi.collectItems().first().convert().with(UniRxConverters.toSingle()); + return multi.collect().first().convert().with(UniRxConverters.toSingle()); } } diff --git a/rxjava/src/main/java/io/smallrye/mutiny/converters/multi/ToSingleFailOnNull.java b/rxjava/src/main/java/io/smallrye/mutiny/converters/multi/ToSingleFailOnNull.java index c619e7699..66555604e 100644 --- a/rxjava/src/main/java/io/smallrye/mutiny/converters/multi/ToSingleFailOnNull.java +++ b/rxjava/src/main/java/io/smallrye/mutiny/converters/multi/ToSingleFailOnNull.java @@ -18,7 +18,7 @@ public class ToSingleFailOnNull implements Function, Single> { @Override public Single apply(Multi multi) { - return multi.collectItems().first() + return multi.collect().first() .onItem().ifNull().failWith(supplier) .convert().with(UniRxConverters.toSingle()) .map(Optional::get);