Сравнить две карты для ключей и вернуть логическое значение

#java #lambda #java-8 #java-stream

#java #лямбда #java-8 #java-stream

Вопрос:

У меня есть две карты, и мне нужно проверить, имеют ли обе одинаковые ключи и одинаковое количество ключей или нет, и вернуть логическое значение. Я хотел бы использовать streams для этого, и я получил это, создав другой список

 mapA
.entrySet()
.stream()
.filter(entry -> mapB.containsKey(entry.getKey()))
.collect(
    Collectors.toMap(Entry::getKey, Entry::getValue));
  

Но мой вопрос в том, могу ли я сделать это в одной строке, которая не создавала бы другой список, но возвращала логическое значение, независимо от того, совпадают они или нет.

Комментарии:

1. Вы имеете в виду true, когда такие записи существуют?

2. @Andronicus Да, если обе карты имеют одинаковые ключи и одинаковое количество ключей, тогда мне нужно вернуть true, иначе false

3. @YCF_L Спасибо, мне нужно было бы проверить, одинаково ли количество ключей на обеих картах

4. @YCF_L Если у mapA есть дополнительные ключи, которых нет у mapB, containsAll все равно вернет true . Это не то, чего хочет OP.

Ответ №1:

Для этого нет необходимости использовать потоки. Просто получите наборы ключей карт и используйте equals , которые указаны в Set следующим образом:

Возвращает true , если указанный объект также является набором, два набора имеют одинаковый размер, и каждый член указанного набора содержится в этом наборе [.]

 Map<String, Integer> m1 = new HashMap<>();
m1.put("a", 10);
m1.put("b", 10);
m1.put("c", 10);

Map<String, Integer> m2 = new HashMap<>();
m2.put("c", 20);
m2.put("b", 20);
m2.put("a", 20);

System.out.println(m1.keySet().equals(m2.keySet()));  //true