FutureCollectors.java

1
/*
2
 * Copyright 2014-2026 Grzegorz Piwowarek, https://4comprehension.com/
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 * https://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
package com.pivovarit.collectors;
17
18
import java.util.List;
19
import java.util.Objects;
20
import java.util.concurrent.CompletableFuture;
21
import java.util.stream.Collector;
22
import java.util.stream.Collectors;
23
24
import static java.util.stream.Collectors.toList;
25
26
/**
27
 * @author Grzegorz Piwowarek
28
 */
29
final class FutureCollectors {
30
    static <T, R> Collector<CompletableFuture<T>, ?, CompletableFuture<R>> toFuture(Collector<T, ?, R> collector) {
31
        Objects.requireNonNull(collector, "collector cannot be null");
32
33 1 1. toFuture : replaced return value with null for com/pivovarit/collectors/FutureCollectors::toFuture → KILLED
        return Collectors.collectingAndThen(toList(), list -> {
34 1 1. lambda$toFuture$1 : replaced return value with null for com/pivovarit/collectors/FutureCollectors::lambda$toFuture$1 → KILLED
            var future = CompletableFuture.allOf(list.toArray(CompletableFuture[]::new))
35 1 1. lambda$toFuture$2 : replaced return value with null for com/pivovarit/collectors/FutureCollectors::lambda$toFuture$2 → KILLED
              .thenApply(__ -> list.stream()
36
                .map(CompletableFuture::join)
37
                .collect(collector));
38
39 1 1. lambda$toFuture$0 : removed call to com/pivovarit/collectors/FutureCollectors::propagateFailureAndCancelOnFailure → KILLED
            propagateFailureAndCancelOnFailure(list, future, future);
40
41 1 1. lambda$toFuture$0 : replaced return value with null for com/pivovarit/collectors/FutureCollectors::lambda$toFuture$0 → KILLED
            return future;
42
        });
43
    }
44
45
    static <T> Collector<CompletableFuture<T>, ?, CompletableFuture<List<T>>> toFuture() {
46 1 1. toFuture : replaced return value with null for com/pivovarit/collectors/FutureCollectors::toFuture → KILLED
        return toFuture(toList());
47
    }
48
49
    static <T> void propagateFailureAndCancelOnFailure(
50
      List<? extends CompletableFuture<T>> futures,
51
      CompletableFuture<?> failureTarget,
52
      CompletableFuture<?> cancellationTrigger) {
53
        for (var f : futures) {
54
            f.whenComplete((__, ex) -> {
55 1 1. lambda$propagateFailureAndCancelOnFailure$0 : negated conditional → KILLED
                if (ex != null) {
56
                    failureTarget.completeExceptionally(ex);
57
                }
58
            });
59
        }
60
61
        cancellationTrigger.whenComplete((__, ex) -> {
62 1 1. lambda$propagateFailureAndCancelOnFailure$1 : negated conditional → KILLED
            if (ex != null) {
63
                for (var f : futures) {
64
                    f.cancel(true);
65
                }
66
            }
67
        });
68
    }
69
}

Mutations

33

1.1
Location : toFuture
Killed by : com.pivovarit.collectors.FutureCollectorsTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.FutureCollectorsTest]/[method:shouldCollectToList()]
replaced return value with null for com/pivovarit/collectors/FutureCollectors::toFuture → KILLED

34

1.1
Location : lambda$toFuture$1
Killed by : com.pivovarit.collectors.FutureCollectorsTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.FutureCollectorsTest]/[method:shouldCollectToList()]
replaced return value with null for com/pivovarit/collectors/FutureCollectors::lambda$toFuture$1 → KILLED

35

1.1
Location : lambda$toFuture$2
Killed by : com.pivovarit.collectors.FutureCollectorsTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.FutureCollectorsTest]/[method:shouldCollectToList()]
replaced return value with null for com/pivovarit/collectors/FutureCollectors::lambda$toFuture$2 → KILLED

39

1.1
Location : lambda$toFuture$0
Killed by : com.pivovarit.collectors.FutureCollectorsTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.FutureCollectorsTest]/[method:shouldCancelSiblingsOnFirstFailure()]
removed call to com/pivovarit/collectors/FutureCollectors::propagateFailureAndCancelOnFailure → KILLED

41

1.1
Location : lambda$toFuture$0
Killed by : com.pivovarit.collectors.FutureCollectorsTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.FutureCollectorsTest]/[method:shouldCollectToList()]
replaced return value with null for com/pivovarit/collectors/FutureCollectors::lambda$toFuture$0 → KILLED

46

1.1
Location : toFuture
Killed by : com.pivovarit.collectors.FutureCollectorsTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.FutureCollectorsTest]/[method:shouldCollect()]
replaced return value with null for com/pivovarit/collectors/FutureCollectors::toFuture → KILLED

55

1.1
Location : lambda$propagateFailureAndCancelOnFailure$0
Killed by : com.pivovarit.collectors.FutureCollectorsTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.FutureCollectorsTest]/[method:shouldCancelSiblingsOnFirstFailure()]
negated conditional → KILLED

62

1.1
Location : lambda$propagateFailureAndCancelOnFailure$1
Killed by : com.pivovarit.collectors.FutureCollectorsTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.FutureCollectorsTest]/[method:shouldCancelSiblingsOnFirstFailure()]
negated conditional → KILLED

Active mutators

Tests examined


Report generated by PIT 1.30.0 support