如何使用 Eclipse Collection 的 Multimap 创建嵌套组?
How to create nested groups using Eclipse Collection's Multimap?
我很感兴趣地阅读了Map vs. Multimap。 Multimaps 确实是一个常用的概念,没有标准的 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 比较陌生,这可能会以另一种形式存在。
在我了解到更优雅的解决方案之前,我依赖以下方法:
Multimap.keyMultiValuePairsView()
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
。我需要查看代码示例以确认它是否适合您要解决的问题。
我很感兴趣地阅读了Map vs. Multimap。 Multimaps 确实是一个常用的概念,没有标准的 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 比较陌生,这可能会以另一种形式存在。 在我了解到更优雅的解决方案之前,我依赖以下方法:
Multimap.keyMultiValuePairsView()
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
。我需要查看代码示例以确认它是否适合您要解决的问题。