Это зависит от того, как вы хотите, чтобы метод работал. Например, следует ли просто игнорировать элементы в keys
, которые не входят в map
A) , или они B) должны быть представлены как null
в коллекции возвращаемых значений или это C) должно быть ошибкой? Также подумайте, хотите ли вы просматривать в реальном времени или отдельную коллекцию, содержащую значения.
Для A я бы предпочел:
Collection<V> values = Collections2.transform(
Collections2.filter(keys, Predicates.in(map.keySet()),
Functions.forMap(map));
Это ограничивает результат значениями для ключей, которые фактически находятся на карте и должны быть относительно эффективными, даже если карта намного больше, чем набор ключей, который вы хотите. Конечно, вы можете скопировать этот результат в другую коллекцию, в зависимости от того, что вы хотите с ней сделать.
Для B вы бы использовали решение @Michael Brewer-Davis, кроме как с Functions.forMap(map, null)
.
Для C вы сначала захотите проверить это map.keySet().containsAll(keys)
и сгенерировать ошибку, если false
, а затем использовать решение @Michael Brewer-Davis ... но учтите, что если только вы скопировал результат в другую коллекцию, удаление записи из map
может вызвать IllegalArgumentException
для кода, использующего возвращенную коллекцию в некоторый момент.