Что выведет этот код? public class StreamApi { @Data @AllArgsConstructor public static class Client { private String name; private String city; } public static Map<String, Long> countBy(Stream<Client> clients, Function<Client, String> clientParameterGetter) { return clients.collect(Collectors.groupingBy(clientParameterGetter, TreeMap::new, Collectors.counting())); } public static void main(String[] args) { List<Client> clients = List.of( new Client("Иванов", "Москва"), new Client("Михайлов", "Санкт-Петербург"), new Client("Сергеев", "Санкт-Петербург"), new Client("Иванов", null), new Client("Сергеев", null) ); long count = clients.stream() .peek(client -> { if (client.getCity() == null) { client.setCity("Москва"); } }) .count(); Predicate<Client> clientPredicate = client -> client.getCity() != null; Stream<Client> validClients = clients.stream().filter(clientPredicate); System.out.println(count); System.out.println(countBy(validClients, Client::getName)); System.out.println(countBy(validClients, Client::getCity)); } }
Ответ от нейросети
sobes.tech AI
Код выведет следующее:
-
Переменная
count— это количество элементов в спискеclients. В списке 5 клиентов, значитcountбудет 5. -
Метод
countByгруппирует клиентов по заданному параметру и считает количество клиентов в каждой группе. -
Важно, что перед подсчетом
countв стриме вызываетсяpeek, который заменяетnullв полеcityна "Москва". Это изменяет объекты в исходном списке, так как объекты изменяемые. -
Далее создается стрим
validClients, который фильтрует клиентов с непустымcity. Послеpeekу всех клиентовcityнеnull(у двух, где былоnull, теперь "Москва"), значит фильтр пропустит всех 5 клиентов. -
Первый вызов
countBy(validClients, Client::getName)сгруппирует клиентов по имени:
- "Иванов" — 2 клиента
- "Михайлов" — 1 клиент
- "Сергеев" — 2 клиента
- Второй вызов
countBy(validClients, Client::getCity)сгруппирует по городу:
- "Москва" — 3 клиента (Иванов с null заменен на "Москва", Сергеев с null заменен на "Москва", и Иванов изначально с "Москва")
- "Санкт-Петербург" — 2 клиента
Итоговый вывод:
5
{Иванов=2, Михайлов=1, Сергеев=2}
{Москва=3, Санкт-Петербург=2}
Ключевой момент — peek изменяет объекты в исходном списке, что влияет на последующую фильтрацию и группировку.