### Question:
Part2CreationTransformationTermination { @Complexity(EASY) public static Publisher<GroupedFlux<Character, String>> groupWordsByFirstLatter(Flux<String> words) { throw new RuntimeException("Not implemented"); }  @Complexity(EASY) static Mono<List<String>> collectAllItemsToList(Flux<String> source); @Complexity(EASY) static String lastElementFromSource(Flux<String> source); @Complexity(EASY) static Publisher<String> mergeSeveralSources(Publisher<String>... sources); @Complexity(EASY) static Publisher<String> fromFirstEmitted(Publisher<String>... sources); @Complexity(EASY) static Publisher<GroupedFlux<Character, String>> groupWordsByFirstLatter(Flux<String> words); @Complexity(MEDIUM) static Mono<String> executeLazyTerminationOperationAndSendHello(Flux<String> source); @Complexity(MEDIUM) static Publisher<String> zipSeveralSources(Publisher<String> prefix,
                                                      Publisher<String> word,
                                                      Publisher<String> suffix); @Complexity(HARD) static Publisher<String> combineSeveralSources(Publisher<String> prefix,
                                                          Publisher<String> word,
                                                          Publisher<String> suffix); @Complexity(HARD) static Flux<IceCreamBall> fillIceCreamWaffleBowl(
            Flux<IceCreamType> clientPreferences,
            Flux<IceCreamBall> vanillaIceCreamStream,
            Flux<IceCreamBall> chocolateIceCreamStream
    );  }### Answer:
@Test public void groupByWordsByFirstLatterTest() { StepVerifier .create( Flux .from(groupWordsByFirstLatter(Flux.just("ABC", "BCD", "CDE", "BEF", "ADE", "CFG"))) .flatMap(gf -> gf.collectList().map(l -> Tuples.of(gf.key(), l))) ) .expectSubscription() .expectNext(Tuples.of('A', Arrays.asList("ABC", "ADE"))) .expectNext(Tuples.of('B', Arrays.asList("BCD", "BEF"))) .expectNext(Tuples.of('C', Arrays.asList("CDE", "CFG"))) .verifyComplete(); }