0

Here is roughly the code that I want to change:

        final List<Objects> list = evaluators.parallelStream()
                .map(evaluator -> evaluator.evaluate())
                .flatMap(List::stream)
                .collect(Collectors.toList());

I want to change the evaluator.evaluate() method to return a Pair<List, List> instead. Something like:

        final Pair<List<Object>, List<String>> pair = evaluators.parallelStream()
                .map(evaluator -> evaluate())
                ...?

Such that if evaluatorA returned Pair<[1,2], [a,b]> and evaluatorB returned Pair<[3], [c,d]> then the end result is a Pair<[1,2,3], [a,b,c,d]>.

Thanks for your help.

strawbee
  • 11
  • 3

1 Answers1

0

I ended up implementing a customer collector for the Pair of Lists:

...
    .collect(
        // supplier
        () -> Pair.of(new ArrayList<>(), new ArrayList<>()),
        // accumulator
        (accumulatedResult, evaluatorResult) -> {
            accumulatedResult.getLeft().addAll(evaluatorResult.getLeft());
            accumulatedResult.getRight().addAll(evaluatorResult.getRight());
        },
        // combiner
        (a, b) -> {
            a.getLeft().addAll(b.getLeft());
            a.getRight().addAll(b.getRight());
        }
    );
strawbee
  • 11
  • 3