如何使用 Eclipse Collection 的 Multimap 创建嵌套组?

How to create nested groups using Eclipse Collection's Multimap?

我很感兴趣地阅读了Map vs. MultimapMultimaps 确实是一个常用的概念,没有标准的 JDK 类型。

由于我仍在探索 Eclipse Collections 库,因此我对 Eclipse Collection 的 Multimaps.

的使用有一些疑问

首先,使用 Eclipse Collections 创建嵌套组的最优雅方法是什么? 使用标准 Java 流,它只是使用另一个 groupingBy 收集器作为下游。 这允许您创建任意深度的嵌套组。

Map<K1, Map<K2, List<V>>> collect = List.of(V, V, V, ...).stream()
    .collect(
        Collectors.groupingBy(
            Function<V, K1>,
            Collectors.groupingBy(
                Function<V, K2>,
                Collectors.toList()
            )
        )
    );

你能使用 Eclipse Collections 实现类似的东西吗?


作为后续问题,我找不到 collect 方法来对一个完整的组进行操作,例如:

Multimap.collectMultiValues(Function<? super RichIterable<V>,?> function)

由于我对这个 API 比较陌生,这可能会以另一种形式存在。 在我了解到更优雅的解决方案之前,我依赖以下方法:

  1. Multimap.keyMultiValuePairsView()
  2. Multimap.forEachKeyMultiValues(Procedure2<? super K,? super RichIterable<V>> procedure)

Eclipse Collections 与 Java Streams 一起使用。库中有一个 Collectors2 实用程序 class,它 returns 库中的特定类型,例如 Multimap。以下代码将 List 个水果字符串按第一个字母分组,然后按水果的长度分组。可变类型和不可变类型有 Collectors,所以我在下面展示了这两种类型。

List<String> fruit = 
        List.of("apple", "apricot", "banana", "blueberry", "clementine");

Map<String, MutableListMultimap<Integer, String>> groupedMutable =
        fruit.stream().collect(
                Collectors.groupingBy(
                        each -> each.substring(0, 1),
                        Collectors2.toListMultimap(String::length)));

Map<Object, ImmutableListMultimap<Integer, String>> groupedImmutable =
        fruit.stream().collect(
                Collectors.groupingBy(
                        each -> each.substring(0, 1),
                        Collectors2.toImmutableListMultimap(String::length)));

Assertions.assertEquals(groupedImmutable, groupedImmutable);
Assertions.assertEquals(List.of("apple"), groupedMutable.get("a").get(5));
Assertions.assertEquals(List.of("apricot"), groupedMutable.get("a").get(7));
Assertions.assertEquals(List.of(), groupedMutable.get("a").get(10));
Assertions.assertEquals(List.of("banana"), groupedMutable.get("b").get(6));
Assertions.assertEquals(List.of(), groupedMutable.get("b").get(8));
Assertions.assertEquals(List.of("blueberry"), groupedMutable.get("b").get(9));
Assertions.assertEquals(List.of("clementine"), groupedMutable.get("c").get(10));
Assertions.assertEquals(List.of(), groupedMutable.get("c").get(5));

multi-level 分组没有特定于 Eclipse Collections 的方法。我们认为 Java Streams 处理得很好,提供互操作比替代方案更好。

对于你问题的第二部分(它本身可能是一个问题),我认为你可能正在寻找的方法是 collectKeyMultiValues。我需要查看代码示例以确认它是否适合您要解决的问题。