Как определить входные значения для различных функций в потоках - PullRequest
0 голосов
/ 18 сентября 2018

Этот вопрос может быть очень примитивным с коллекциями Java 8.

Как лучше понять, как Java 8 передает входные значения между различными этапами обработки потока.Если есть документация, объясняющая это ясно, я рад прочитать, но я не смог встретиться ни с чем.

Например, groupingBy принимает функцию с именем классификатора, это принимает тип T и преобразуется в Ktype.

static <T,K> Collector<T,?,Map<K,List<T>>> 
    groupingBy(Function<? super T,? extends K> classifier)

В приведенном ниже примере мы передаем только тип K. Неясно, когда в потоках будут автоматически учитываться входные значения (тип T)?Как я могу понять это лучше?

Map<BlogPostType, List<BlogPost>> postsPerType = posts.stream()
.collect(groupingBy(BlogPost::getType));

1 Ответ

0 голосов
/ 18 сентября 2018

В приведенном ниже примере мы передаем только тип K. Не ясно, когда в потоках будут автоматически учитываться входные значения (Тип T)?

Map<BlogPostType, List<BlogPost>> postsPerType = posts.stream()
            .collect(Collectors.groupingBy(BlogPost::getType));

Обратите внимание на ссылку на метод в коде, которая эквивалентна функциональному интерфейсу Function<T,R> с единственным методом apply, представленным как getType() метод из BlogPost в вашем коде.

Как мне лучше это понять?

Один из способов лучше понять код - просто переписать упрощенный код:

Function<? super BlogPost, ? extends BlogPostType> classifier = BlogPost::getType;
// ^^^__you can see the correlation with Collectors#groupingBy(classifier)

Map<BlogPostType, List<BlogPost>> postsPerType = posts.stream()
            .collect(Collectors.groupingBy(classifier));

с возвратомтип из groupingBy , являющийся Collector<BlogPost, ?, Map<BlogPostType, List<BlogPOst>>>, позволяет дополнительно собирать postPerType благодаря реализации потока collect , имеющей подпись <R, A> R collect(Collector<? super T, A,R> collector).

...