我有以下片段:

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));
}

09-15 21:59