有一种方法可以对来自多个字段的集合的元素进行分组。
public void test() {
List<Item> itemsList = ...//Чтение из XML;
Map<List<Object>, List<Item>> groupBy =
itemsList.stream().collect(Collectors.groupingBy(
i -> Arrays.asList(i.id, i.city, i.order_status)));
for (Map.Entry<List<Object>, List<Item>> t : groupBy.entrySet()) {
System.out.println(t.getKey());
for (Item item : t.getValue()) {
System.out.println(" " + item);
}
}
}
以及如何在没有 Stream API 的情况下做同样的事情?
简单地创建一个映射,并明确指示键和值的类型,在一个循环中,您遍历列表并使用此方法将元素添加到映射 - 如果需要,此方法创建一个新的或返回现有的列表
Map::computeIfAbsent值,您可以立即调用该方法List:add。在这种情况下
LinkedHashMap,最好使用使其中元素的顺序稳定(HashMap不保证顺序)。hashCode应该注意的是,使用一些你需要正确重新定义方法和的中间类而不是对象列表会更正确equals。record这对于自 Java 16 以来正式支持的元组或 Lombok 注释@Data/来说很容易做到@AllArgsConstructor。如果需要,可以为任何键参数化创建这样的分组,如果您传递某个转换器函数
Function<Item, Key>,在上一个示例中,这样的函数是元组构造函数MyKey(Item item)。例如,要生成列表键,可以定义一个单独的工厂方法:参数化方法如下所示:
因此,可以为任何键调用它: