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);
}
}
- Сбор в карту с использованием ключа и значения
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);
}
}
- Подсчет количества элементов
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);
}
}
- Группировка по возрасту
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);
}
}
- Объединение строк в одну
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.