我有以下片段:
List<O> os = new ArrayList<>();
os.add(new O("A", 3, "x"));
os.add(new O("A", 2, "y"));
os.add(new O("B", 1, "z"));
Comparator<O> byA = Comparator.comparing(O::getA);
Comparator<O> byB = Comparator.comparing(O::getB);
// I want to use rather this...
List<Comparator<O>> comparators = new ArrayList<>();
comparators.add(byA);
comparators.add(byB);
os.stream()
.sorted(byB.thenComparing(byA))
.forEach(o -> System.out.println(o.getC()));
如您所见,我显式地使用两个比较器进行排序。但是,如果我在某些列表中有未知数量的比较器,并且想按它们全部排序怎么办?有什么办法吗?还是应该使用带有多个if的老式比较器?
最佳答案
如果列表或任何其他集合中有多个比较器,则可以通过对Stream
进行归约来将它们替换为单个比较器:
List<Comparator<String>> comparators = ...
Comparator<String> combined = comparators.stream()
.reduce(Comparator::thenComparing)
.orElse(someDefaultComparator); // empty list case
所有实例将根据输入列表中的顺序使用
thenComparing
组合在一起。通过使用简单的for循环,使用非流方法可以实现相同的目的:
Comparator<String> result = comparators.get(0);
for (int i = 1; i < comparators.size(); i++) {
result = result.thenComparing(comparators.get(i));
}