私は次のような地図を持っています:
_class Person {
Long personId;
String name;
/*Getters and Setters*/
}
_
マップにデータを入力しましたMap<Long, Person> personMap = new HashMap<>();
マップのキーはpersonId自体です。私はそのようなpersonIdsのリストを持っています、
List<Long> coolPeople = new ArrayList<>();
ここで、マップを反復処理して、リストcoolPeople
のIDに対応するキーを持つすべての値を取得し、それをリストに格納します。
Java 8でこれを最適に達成するにはどうすればよいですか?
List
でのキーによる検索には予想されるO(1)
時間がかかり、Map
での検索にはO(n)
最悪の場合の時間。
List<Person> people =
coolPeople.stream()
.map(id -> personMap.get(id)) // or map(personMap::get)
.filter(Objects::nonNull)
.collect(Collectors.toList());
別の解決策(そしておそらくより効率的-マップ/リストのサイズによっては)は、マップをコピーしてkeySet
に直接作用することです。
Map<Long, Person> copy = new HashMap<> (personMap);
copy.keySet().retainAll(coolPeople);
Collection<Person> result = copy.values();
これを修正してください:
List<Long> coolPeople = new ArrayList();
そして他の部分のために:
List<Person> coolPersons=new ArrayList<Person>();
for (Long id:coolPeople) {
Person p=map.get(id);
coolPersons.add(p);
}
ご不明な点がございましたら、お気軽にコメントしてください。
マップを返すことに興味がある場合は、次を使用できます。
public static <K, V> Map<K, V> filterByKeys(final Map<K, V> map, final Iterable<K> keys) {
final Map<K, V> newMap = new HashMap<>();
keys.forEach(key -> Optional.ofNullable(map.get(key))
.ifPresent(value -> newMap.put(key, value)));
return newMap;
}