我有一系列未分类的项目和一组比较器。 我想通过使用“thenComparing”(Multisort)将所有比较器应用到流中 是否有比以下代码更优雅的方式来实现这个目标?
Stream unsorted = ...;
Stream<Comparator> comparators = ...;
Comparator compareFunc = comparators.reduce(null, (a, b) -> {
if(a == null) {
return b;
}else {
return a.thenComparing(b);
}
});
Stream result = unsorted.sorted(compareFunc);
答案 0 :(得分:7)
请勿对Comparator
使用标识值。如果comparators
流为空(即不包含任何Comparator
),则不应对其进行排序:
Stream result=comparators.reduce(Comparator::thenComparing)
.map(unsorted::sorted).orElse(unsorted);
请注意,如果comparators
信息流仅包含一个Comparator
,那么Comparator
将是减少的结果。
传递给Optional.map
的方法参考可能需要一些经验才能适应它。因此,使用更详细的lambda语法来显示正在发生的事情可能是值得的:
Stream<String> result=comparators.reduce(Comparator::thenComparing)
.map((comparator) -> unsorted.sorted(comparator)).orElse(unsorted);
这是编程风格或个人偏好的问题,可能会随着时间而改变。
答案 1 :(得分:5)
使用Mark Peters的建议并将其与方法参考混合,您可以这样编写比较器:
Comparator compareFunc = comparators.reduce((a, b) -> 0, Comparator::thenComparing);
或者从Holger那里偷了一点:
Optional<Comparator> compareFunc = comparators.reduce(Comparator::thenComparing);
Stream<?> result = compareFunc.isPresent() ? result.sorted(compareFunc.get())
: unsorted;