我需要 Java 8 中的一种方法来对多个 Comparator 对象上的 Item 对象列表进行排序。
应用程序会针对每个用户操作创建一个比较器。它将 Comparator 对象存储在 ArrayList 中。可以对一个比较器项目进行排序,但现在我们需要一种方法来同时对多个比较器项目进行排序。
我用这行代码对列表进行排序:
tbl.getItems().stream().sorted(groupingComparator);
变量 groupingComparator 来自类型 Comparator<Item>
现在我需要对存储在的多个字段进行排序
ArrayList<Comparator<Item>>
这在 Java 8 中可能吗?我该如何实现这个?
最佳答案
您可以使用 Comparator 接口(interface)中提供的 thenComparing(Comparator)
方法将多个比较器链接在一起。请参阅下面的示例,使用流从列表创建这样的链式比较器。
我们要用于排序的域类:
public static class Order {
String customer;
String item;
public Order(String customer, String item)
{
this.customer = customer;
this.item = item;
}
public String toString() {
return "Customer: " + customer + " Item: " + item;
}
}
示例代码:
public static void main(String... args) throws Throwable
{
List<Order> orders = new ArrayList<>();
orders.add(new Order("A", "Item 1"));
orders.add(new Order("B", "Item 3"));
orders.add(new Order("A", "Item 2"));
orders.add(new Order("B", "Item 1"));
List<Comparator<Order>> comparators =
Arrays.asList((o1, o2) -> o1.customer.compareTo(o2.customer), // comparator for customer names
(o1, o2) -> o1.item.compareTo(o2.item)); // comparator for item names
Comparator<Order> comp =
comparators.stream()
.reduce(Comparator::thenComparing)
// use a default comparator if the comparator list was empty
.orElse(Comparator.comparing(Object::toString));
orders.stream().sorted(comp).forEach((order) -> System.out.println(order));
}
此代码段将打印先按客户排序,然后按商品名称排序的订单。
关于sorting - 对多个比较器项目进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37852996/