2017-03-13 29 views
2

我有多重映射,我想将它切成使用上键两个谓词两个不同的地图:的Java:切片番石榴多重映射

A -> keyPred1(K) -> A_1 
A -> keyPred2(K) -> A_2 

在我这样做让所有值的瞬间,用过滤它keyPred1/keyPred2和重建从屈德宁一遍值:

values1 = a.entries().stream() 
       .filter(e -> keyPred1(e.getKey())) 
       .collect(Collectors.toList()); 

a1 = rebuildMapFromValues(values1); 

这没关系,但还是看起来有点笨重。有没有办法以更聪明的方式解决问题?

+2

https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Multimaps.html#filterKeys-com.google.common.collect。 Multimap-com.google.common.base.Predicate- –

+0

@JBNizet获得100%满意答案! –

回答

1

您可以通过使用Multimaps.filterKeys(Multimap, Predicate)得到过滤多重映射生活意见:

Multimap<K, V> a1 = Multimaps.filterKeys(a, key -> keyPred1(key)); 
Multimap<K, V> a2 = Multimaps.filterKeys(a, key -> keyPred2(key)); 

如果你不想生活意见,那么你可以筛选视图复制到自己的多重映射实例。例如:

Multimap<K, V> a1 = HashMultimap.create(Multimaps.filterKeys(a, key -> keyPred1(key))); 
Multimap<K, V> a2 = HashMultimap.create(Multimaps.filterKeys(a, key -> keyPred2(key)));