У НАС есть карта Студенты { studentId : StudentData }.
StudentData — это POJO с атрибутами студента.
Требование состоит в том, чтобы получить всех учеников с атрибутом isCurrent==true.
Если да, то извлеките атрибут города для студента.
Это будет использоваться для увеличения количества студентов на карте { city : count }
Students.entrySet()
.stream()
.filter(x -> true == x.getValue().isCurrent())
.forEach(x -> {
studentpercity(x.getValue().getCity(), (studentpercity.getOrDefault(x.getValue().getCity(), 0) + 1));
});
Конечным результатом будет карта города для подсчета «нынешних» студентов.
Есть ли более эффективный способ добиться этого?
Каков именно желаемый результат? Просто номер для данного города? Или, может быть, Map<String, Integer>, представляющий города и соответствующее количество студентов? Или у вас есть такой Map и вы хотите сделать инкрементные счетчики?
Я не думаю, что вам нужно фильтровать поток. Вы можете просто добавить оператор if внутри цикла forEach, чтобы «сохранить» итерацию фильтра в потоке.




Вы можете сделать это так,
Map<String, Long> studentPerCity = students.values().stream().filter(StudentData::isCurrent)
.collect(Collectors.groupingBy(StudentData::getCity, Collectors.counting()));
Другой вариант может выглядеть так:
students.values().stream()
.filter(StudenData::isCurrent)
.map(StudenData::getCity)
.forEach(city -> studentpercity(city, studentpercity.getOrDefault(city, 0) + 1));
Однако, что касается вашего комментария о «итерациях». В одном потоке (например, в вашем примере) каждый элемент повторяется только один раз. Это означает, что каждая операция в потоке будет применена один раз к каждому элементу и только в том случае, если она не отфильтрована ранее.
However,this seems to involve multiple iterations of the map.- Как вы думаете, почему требуется несколько итераций? Я вижу одну итерацию над записями карты.