Рубрики
Без рубрики

Новые коллекторы потока на Java 9

В этой статье мы исследуем новых коллекторов Stream, которые были представлены в JDK 9

Автор оригинала: baeldung.

1. Обзор

Коллекционеры были добавлены в Java 8, которые помогли накопить входные элементы в мутируемые контейнеры, такие как Карта , Список , и Установить .

В этой статье мы собираемся изучить два новых коллекционера добавлены в Java 9: Коллекторы.фильтрация и Коллекционеры.flatMapping используется в сочетании с Коллекционеры.группировка предоставление интеллектуальных коллекций элементов.

2. Фильтровающий коллектор

Коллекторы.фильтрация похож на Фильтр потока () ; он используется для фильтрация входных элементов, но используется для различных сценариев. Поток фильтр используется в цепочке потока, в то время как фильтрация является Коллекционные который был разработан для использования вместе с группировка .

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

Коллекторы.фильтрация функцию фильтрации входных элементов и коллектора для сбора отфильтрованных элементов:

@Test
public void givenList_whenSatifyPredicate_thenMapValueWithOccurences() {
    List numbers = 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 List comments;
      
    // 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");
    List blogs = 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 .