По сути, чтобы понять, почему компилятор не выдает ошибку, вам нужно посмотреть String.equals () реализация метода
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Теперь вернемся к этой строке:
s.getId().equals(map.entrySet().stream().map(Map.Entry::getKey))
Как мы знаем, s.getId()
имеет тип String
, а map.entrySet().stream().map(Map.Entry::getKey)
имеет тип Stream<String>
.
Поскольку Stream<String>
не instanceof String
, ясно, что метод String.equals()
будет возвращать false
каждый раз, когда s.getId()
сравнивается с map.entrySet().stream().map(Map.Entry::getKey)
(следовательно, 0 считается в конце).И компилятор не выдает ошибку, потому что ничего противозаконного на самом деле не произошло (с учетом реализации String.equals()
).
Также, возможно, самый чистый способ найти count
без предупреждений мог быбыть:
System.out.println(
stulist.stream()
.map(Student::getId)
.filter(map::containsKey)
.count());