#java #java-8 #stream #java-stream
#java #java-8 #поток #java-поток
Вопрос:
Я хочу проверить, что любой из ключей карты содержится в каком-либо другом наборе, и вернуть true, как только будет найдено одно совпадение. Общий способ сделать это будет выглядеть так
for each element in the set:
for each key of the map:
if current element of set == current key of map
return true
Я хочу сделать это, используя потоки в Java. Поэтому я считаю, что способ преобразования ключей карты в поток будет следующим
myMap.entries().stream().map(Map.Entry::getKey)
но затем запустите цикл for для каждого из них, это то, что я ищу.
Другой способ, о котором я думал, был чем-то вроде приведенного ниже
myMap.keySet().forEach((k) -> set.contains(k));
но я хочу, чтобы внешний цикл был из набора, потому что в наборе меньше элементов, чем в карте.
Ответ №1:
Вы можете написать либо
return myMap.keySet().stream().anyMatch(set::contains);
или
return set.stream().anyMatch(myMap::containsKey);
Последнее должно быть более эффективным, если Set
меньше, чем Map
, поскольку оба set::contains
и myMap::containsKey
должны занимать ожидаемое постоянное время (при условии HashMap
/ HashSet
реализации).
Комментарии:
1. Слишком рассеян, чтобы задать вопрос о сложности, спасибо, что указали на это.
2. @SonaliGupta на самом деле я изменил часть о сложности. Потоковая передача по Сету должна быть более эффективной.
3. Отмечено выше. для второго варианта будет установлен set.stream().anyMatch(myMap.entrySet()); быть таким же, потому что мне легче читать, если оно одинаковое для возврата логического значения.
4. @SonaliGupta вы не можете перейти
myMap.entrySet()
кanyMatch
, поскольку это не предикат. Вам придется пройтиx -> myMap.entrySet().contains(x)
.5. Да, он не компилируется. Я хотел понять, что это означает anyMatch во всем наборе записей. Но я думаю, это означает, что любой элемент набора соответствует любому ключу карты. Довольно ясно. далее будет подробно прочитано. Спасибо, что ответили на вопросы.
Ответ №2:
Map<K, V> map = ...;
Set<K> keySet = ...;
boolean exists = map.keySet().stream().anyMatch(keySet::contains);
Более подробную информацию смотрите Здесь .