1. Обзор
Коллекционеры были добавлены в Java 8, которые помогли накопить входные элементы в мутируемые контейнеры, такие как Карта , Список , и Установить .
В этой статье мы собираемся изучить два новых коллекционера добавлены в Java 9: Коллекторы.фильтрация и Коллекционеры.flatMapping используется в сочетании с Коллекционеры.группировка предоставление интеллектуальных коллекций элементов.
2. Фильтровающий коллектор
Коллекторы.фильтрация похож на Фильтр потока () ; он используется для фильтрация входных элементов, но используется для различных сценариев. Поток фильтр используется в цепочке потока, в то время как фильтрация является Коллекционные который был разработан для использования вместе с группировка .
С Поток фильтр , значения фильтруются сначала, а затем сгруппированы. Таким образом, значения, которые отфильтрованы ушли, и нет никаких следов этого. Если нам нужен след, то нам нужно будет сначала сгрупповаться, а затем применить фильтрацию, которая на самом деле Коллекторы.фильтрация делает.
Коллекторы.фильтрация функцию фильтрации входных элементов и коллектора для сбора отфильтрованных элементов:
@Test public void givenList_whenSatifyPredicate_thenMapValueWithOccurences() { Listnumbers = List.of(1, 2, 3, 5, 5); Map result = numbers.stream() .filter(val -> val > 3) .collect(Collectors.groupingBy(i -> i, Collectors.counting())); assertEquals(1, result.size()); result = numbers.stream() .collect(Collectors.groupingBy(i -> i, Collectors.filtering(val -> val > 3, Collectors.counting()))); assertEquals(4, result.size()); }
3. Коллекционер FlatMapping
Коллекционеры.flatMapping похож на Collectors.mapping но имеет более мелкозернистую цель. Оба коллектора берет функцию и коллектор, где элементы собираются, но flatMapping функция принимает Поток элементов, которые затем накапливаются коллектором.
Давайте посмотрим следующий класс модели:
class Blog { private String authorName; private Listcomments; // constructor and getters }
Коллекционеры.flatMapping позволяет нам пропустить промежуточный сбор и написать непосредственно в один контейнер, который отображается в этой группе, определяемой Коллекционеры.группировка :
@Test public void givenListOfBlogs_whenAuthorName_thenMapAuthorWithComments() { Blog blog1 = new Blog("1", "Nice", "Very Nice"); Blog blog2 = new Blog("2", "Disappointing", "Ok", "Could be better"); Listblogs = List.of(blog1, blog2); Map >> authorComments1 = blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.mapping(Blog::getComments, Collectors.toList()))); assertEquals(2, authorComments1.size()); assertEquals(2, authorComments1.get("1").get(0).size()); assertEquals(3, authorComments1.get("2").get(0).size()); Map > authorComments2 = blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.flatMapping(blog -> blog.getComments().stream(), Collectors.toList()))); assertEquals(2, authorComments2.size()); assertEquals(2, authorComments2.get("1").size()); assertEquals(3, authorComments2.get("2").size()); }
Collectors.mapping карты всех сгруппированных комментариев автора к контейнеру коллекционера т.е. Список в то время как эта промежуточная коллекция удаляется flatMapping так как он дает прямой поток списка комментариев, который будет отображен в контейнере коллекционера.
4. Заключение
Эта статья иллюстрирует использование нового Коллекционеры введены в Java9 т.е. Коллекционеры.фильтрация () и Коллекционеры.flatMapping() используется в сочетании с Коллекционеры.группировкаБев() .
Эти коллекторы также могут быть использованы вместе с Коллекционеры.partitioningBy() но он создает только две перегородки, основанные на условиях, и реальная власть коллекционеров не заемных средств; следовательно, оставили из этого учебника.
Полный исходный код фрагментов кода в этом учебнике доступен более на GitHub .