Поток кода с комбинацией stream, collect и forEach в java - PullRequest
3 голосов
/ 18 марта 2020

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

void pAccount(List<Account> accounts) {
    accounts.stream()
        .filter(o->getKey(o) != null)
        .collect(Collectors.groupingBy(this::getKey))
        .forEach(this::pAccounts);
}

private Key getKey(Account account) {
    return keyRepository.getKeyById(account.getId());
}

private void pAccounts(Key key , List<Account> accounts) {
    //Some Code
}

Во время отладки мы пришли к выводу, что pAccount(List<Account> accounts) вызывает pAccounts(Key key , List<Account> accounts.

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

Я хочу знать, является ли это какой-то функциональностью в потоках, которая позволяет нам делать это, или это что-то еще.

1 Ответ

5 голосов
/ 18 марта 2020

Метод, на который вы ссылаетесь, вызывается в forEach(this::pAccounts). Это потому что collect(Collectors.groupingBy(this::getKey)) возвращает Map.

forEach на Map, согласно javado c, принимает BiConsumer<? super K,? super V>, где первый параметр равен ключ типа K, а второй - значение типа V.

Так что forEach не метод для Stream, а для Map.

...