【发布时间】:2015-04-02 16:18:58
【问题描述】:
为了提高效率,我经常遇到需要多地图地图的情况。我更喜欢使用 Guava 的 ImmutableMap 和 ImmutableMultimap 来实现这一点。
我为 Guava 借用并创建了几个 Collector 实现,因此我可以利用 Java 8 流。例如,这里是一个ImmutableListMultimap 的收集器。
public static <T, K, V> Collector<T, ?, ImmutableListMultimap<K, V>> toImmutableListMultimap(
Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends V> valueMapper) {
Supplier<ImmutableListMultimap.Builder<K, V>> supplier = ImmutableListMultimap.Builder::new;
BiConsumer<ImmutableListMultimap.Builder<K, V>, T> accumulator = (b, t) -> b
.put(keyMapper.apply(t), valueMapper.apply(t));
BinaryOperator<ImmutableListMultimap.Builder<K, V>> combiner = (l, r) -> l.putAll(r.build());
Function<ImmutableListMultimap.Builder<K, V>, ImmutableListMultimap<K, V>> finisher = ImmutableListMultimap.Builder::build;
return Collector.of(supplier, accumulator, combiner, finisher);
}
我想为我当前的问题创建一个非常相似的收集器。我希望我的收集器创建一个ImmutableMap<P,ImmutableMultimap<C,V>>,其中P 是主映射的父键,C 是子映射的子键。将提供两个 Function lambda 来为每个 T 项目映射这些键。
这说起来容易做起来难。到目前为止,我所做的只是创建方法存根。
public static <T, P, C, V> Collector<T, ?, ImmutableMap<P, ImmutableMultimap<C,V>>> toPartitionedImmutableMultimap(
Function<? super T, ? extends P> parentKeyMapper,
Function<? super T, ? extends C> childKeyMapper,
Function<? super T, ? extends V> valueMapper) {
}
因为 Guava 不可变集合构建器不允许查找,我发现自己使用可变哈希映射能够查找以前捕获的值,所以我只会在 P 键不存在时创建一个新的 ImmutableMultimap。但这个过程很快就变得令人眼花缭乱。
有没有有效的方法来做到这一点?
【问题讨论】:
标签: java lambda java-8 guava java-stream