#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