如何链接和应用比较器流?

我有一系列未分类的项目和一组比较器。 我想通过使用“thenComparing”(Multisort)将所有比较器应用到流中。是否有比以下代码更优雅的方式来实现这一点?

Stream unsorted = ...; Stream comparators = ...; Comparator compareFunc = comparators.reduce(null, (a, b) -> { if(a == null) { return b; }else { return a.thenComparing(b); } }); Stream result = unsorted.sorted(compareFunc); 

不要为Comparator使用标识值 。 如果comparators流为空(即不包含任何Comparator ),则不应排序:

 Stream result=comparators.reduce(Comparator::thenComparing) .map(unsorted::sorted).orElse(unsorted); 

请注意,如果comparators流仅包含一个Comparator comparators ,则该comparators将是减少的结果。


传递给Optional.map的方法引用可能需要一些经验才能适应它。 因此,使用更详细的lambda语法来显示正在发生的事情可能是值得的:

 Stream result=comparators.reduce(Comparator::thenComparing) .map((comparator) -> unsorted.sorted(comparator)).orElse(unsorted); 

这是编程风格或个人偏好的问题,可能会随着时间而改变。

使用Mark Peters的建议并将其与方法参考混合,您可以这样编写比较器:

 Comparator compareFunc = comparators.reduce((a, b) -> 0, Comparator::thenComparing); 

或者从Holger那里偷一点:

 Optional compareFunc = comparators.reduce(Comparator::thenComparing); Stream result = compareFunc.isPresent() ? result.sorted(compareFunc.get()) : unsorted;