I have a stream of unsorted items and a stream of comparators. I want to apply all the comparators onto the stream by using \"thenComparing\" (Multisort) Is there a more elegant
Don’t use an identity value for Comparator
s. If the comparators
stream is empty (i.e. does not contain any Comparator
) you should not sort:
Stream result=comparators.reduce(Comparator::thenComparing)
.map(unsorted::sorted).orElse(unsorted);
Note that if the comparators
stream contains only a single Comparator
, that Comparator
will be the result of the reduction.
The method reference passed to Optional.map
might need some experience to get used to it. So it might be worth using the more verbose lambda syntax to show what’s going on there:
Stream<String> result=comparators.reduce(Comparator::thenComparing)
.map((comparator) -> unsorted.sorted(comparator)).orElse(unsorted);
That’s a matter of programming style or personal preference and might change over time.
Using Mark Peters' suggestion and mixing it with a method reference, you could write your comparator this way:
Comparator compareFunc = comparators.reduce((a, b) -> 0, Comparator::thenComparing);
Or stealing a bit from Holger instead:
Optional<Comparator> compareFunc = comparators.reduce(Comparator::thenComparing);
Stream<?> result = compareFunc.isPresent() ? result.sorted(compareFunc.get())
: unsorted;