Цикл For для ключей карты с использованием потоков

#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);
 

Более подробную информацию смотрите Здесь .