Collectors

Collectors — это утилитный класс в Java, который предоставляет статические методы для создания различных коллекторов, используемых в рамках Stream API. Коллекторы позволяют собирать элементы потока в различные структуры данных, такие как списки, множества, карты и другие. Основные применения Collectors:

Сбор данных: Позволяет собирать элементы потока в коллекции, такие как List, Set, Map и т.д.
Агрегация данных: Позволяет выполнять операции агрегации, такие как подсчет, суммирование, нахождение максимума и минимума.
Группировка и разбиение: Позволяет группировать элементы по определенному критерию или разбивать их на подгруппы.

Примеры использования Collectors:

Сборка в список:
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        List<String> fruits = Stream.of("Apple", "Banana", "Cherry", "Date")
            .collect(Collectors.toList());

        System.out.println("Собранные фрукты: " + fruits);
    }
}

Сборка в множество:

import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Set<String> fruitSet = Stream.of("Apple", "Banana", "Cherry", "Apple")
            .collect(Collectors.toSet());

        System.out.println("Собранные фрукты (множество): " + fruitSet);
    }
}

Сборка в карту:

import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> fruitMap = Stream.of("Apple", "Banana", "Cherry")
            .collect(Collectors.toMap(fruit -> fruit, String::length));

        System.out.println("Собранные фрукты (карта): " + fruitMap);
    }
}```


Агрегация данных:



```java
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        int totalLength = Stream.of("Apple", "Banana", "Cherry")
            .collect(Collectors.summingInt(String::length));

        System.out.println("Общая длина названий фруктов: " + totalLength);
    }
}```


Группировка элементов:
```java
 import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;

    public class Main {
        public static void main(String[] args) {
            Map<Integer, List<String>> groupedByLength = Stream.of("Apple", "Banana", "Cherry", "Fig")
                .collect(Collectors.groupingBy(String::length));

            System.out.println("Группировка по длине названий фруктов: " + groupedByLength);
        }
    }

Объяснение примеров:

Сборка в список: Используется Collectors.toList() для сбора элементов потока в List.
Сборка в множество: Используется Collectors.toSet() для сбора элементов потока в Set, что автоматически удаляет дубликаты.
Сборка в карту: Используется Collectors.toMap(), чтобы создать Map, где ключом является название фрукта, а значением — его длина.
Агрегация данных: Используется Collectors.summingInt(), чтобы подсчитать общую длину названий фруктов.
Группировка элементов: Используется Collectors.groupingBy(), чтобы сгруппировать фрукты по длине их названий.

Заключение:

Collectors — это мощный инструмент в Java, который позволяет легко собирать и агрегировать данные из потоков. Он делает работу с коллекциями более удобной и эффективной, позволяя разработчикам писать более чистый и понятный код.


Вот несколько дополнительных примеров использования метода collect с различными коллекторными методами из класса Collectors. Эти примеры демонстрируют, как можно обрабатывать потоки данных и собирать результаты в разные структуры. 1. Сбор уникальных значений в множество

import java.util.*;
import java.util.stream.Collectors;

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("Alice", 30),
            new Person("Bob", 25),
            new Person("Charlie", 30),
            new Person("David", 25)
        );

        // Сбор уникальных возрастов в множество
        Set<Integer> uniqueAges = people.stream()
            .map(Person::getAge) // Извлечение возраста
            .collect(Collectors.toSet()); // Сбор в множество

        System.out.println("Уникальные возраста: " + uniqueAges);
    }
}
  1. Сбор в карту с использованием ключа и значения
import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("Alice", 30),
            new Person("Bob", 25),
            new Person("Charlie", 30)
        );

        // Сбор в карту, где ключ — имя, а значение — возраст
        Map<String, Integer> nameToAgeMap = people.stream()
            .collect(Collectors.toMap(Person::getName, Person::getAge));

        System.out.println("Карта имен и возрастов: " + nameToAgeMap);
    }
}
  1. Подсчет количества элементов
import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("Alice", 30),
            new Person("Bob", 25),
            new Person("Charlie", 30)
        );

        // Подсчет количества людей старше 25 лет
        long count = people.stream()
            .filter(person -> person.getAge() > 25)
            .count();

        System.out.println("Количество людей старше 25 лет: " + count);
    }
}
  1. Группировка по возрасту
import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("Alice", 30),
            new Person("Bob", 25),
            new Person("Charlie", 30),
            new Person("David", 25)
        );

        // Группировка людей по возрасту
        Map<Integer, List<Person>> groupedByAge = people.stream()
            .collect(Collectors.groupingBy(Person::getAge));

        System.out.println("Группировка по возрасту: " + groupedByAge);
    }
}
  1. Объединение строк в одну
import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("Alice", 30),
            new Person("Bob", 25),
            new Person("Charlie", 30)
        );

        // Объединение имен в одну строку, разделенную запятыми
        String names = people.stream()
            .map(Person::getName)
            .collect(Collectors.joining(", "));

        System.out.println("Имена: " + names);
    }
}

Объяснение примеров:

Сбор уникальных значений в множество: Используется Collectors.toSet() для сбора уникальных возрастов.
Сбор в карту: Используется Collectors.toMap() для создания карты, где ключ — имя, а значение — возраст.
Подсчет количества элементов: Используется метод count() для подсчета количества людей старше 25 лет.
Группировка по возрасту: Используется Collectors.groupingBy() для группировки людей по их возрасту.
Объединение строк: Используется Collectors.joining() для объединения имен в одну строку, разделенную запятыми.

Эти примеры показывают, как можно использовать метод collect для различных задач при работе с потоками в Java.