从Map中获取Java / Guava中的一些键的所有值?

是否有一种聪明的方法可以从一个地图中获取所有值?

我想要一个像这样的方法:

public static  Collection getAll(Map map, Collection keys) 

或者已经是番石榴的方式?

这取决于您希望方法如何工作。 例如,应该忽略不在map A)中的keys中的元素,还是应该在返回的值集合中将它们B)表示为null ,或者C)是否应该是错误? 还要考虑您是要实时视图还是包含值的单独集合。

对于A ,我的偏好是:

 Collection values = Collections2.transform( Collections2.filter(keys, Predicates.in(map.keySet()), Functions.forMap(map)); 

这会将结果限制为实际位于地图中的键的值,并且即使地图比您想要的键组大得多,也应该相对有效。 当然,您可能希望将结果复制到另一个集合中,具体取决于您要对其执行的操作。

对于B ,除了使用Functions.forMap(map, null)之外,你将使用@Michael Brewer-Davis的解决方案。

对于C ,您首先要检查map.keySet().containsAll(keys)并在false抛出错误,然后使用@Michael Brewer-Davis的解决方案……但请注意,除非您将结果复制到从另一个集合中删除一个条目可能会导致在某些时候使用返回的集合的代码出现IllegalArgumentException

我同意skaffman的回答,而不是他的结论(我认为这比手动迭代更好)。

这里拼写出:

 public static  Collection getAll(Map map, Collection keys) { return Maps.filterKeys(map, Predicates.in(keys)).values(); } 

此外,这是一个非番石榴版本:

 public static  Collection getAll(Map map, Collection keys) { Map newMap = new HashMap(map); newMap.keySet().retainAll(keys); return newMap.values(); } 

你可以,我想使用Guava的Maps.filteredKeys() ,传入一个匹配你想要的键的Predicate ,但它并不比手动迭代更好。

使用guava: Collections2.transform(keys, Functions.forMap(map));

Java8流:

 keys.stream().map( map::get ).collection( Collection.toList() ); 

或者,如果您担心丢失密钥:

 keys.stream().map( k -> map.getOrDefault( k, null ) ).collection( Collection.toList() ); 

或者,如果您的地图是线程安全且可能很大:

 keys.parallelStream().map( map::get ).collection( Collection.toList() );