Java 8 Stream collect to collections
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8. Надеемся, что данная статья Вам будет полезна. Приятного прочтения!
В этой статье мы рассмотрим сбор данных в коллекции с помощью Stream-ов в Java.
1. Введение
Stream API - новый способ взаимодействия с данными, представляя их в виде конечного потока данных.
Один из методов Stream-ов, collect принимает лямбда-выражение известное как коллектор (Collector), которое собирает данные в необходимую структуру данных.
С ними мы сегодня и научимся работать.
2. Collect to List + filter
Отфильтруем список чисел по четности
До Java 8
1 2 3 4 5 6 7 8 9 10 |
public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List<Integer> evenNumbers = new ArrayList<>(numbers.size()); for (Integer i : numbers) { if (i % 2 == 0) { evenNumbers.add(i); } } System.out.println(evenNumbers); //output [2, 4, 6, 8, 10] } |
Теперь мы можем использовать методы filter и collect
1 2 3 4 5 6 7 8 |
public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List<Integer> evenNumbers = numbers.stream() .filter(i -> i % 2 == 0) .collect(Collectors.toList()); System.out.println(evenNumbers); //output [2, 4, 6, 8, 10] } |
К счастью, свой коллектор нам писать не нужно т.к. в Java 8 добавили утилитный класс Collectors с необходимыми методами. Collect в сочетании с Collectors.toList возвращают List (реализация - ArrayList)
3. Collect to Set + map
Преобразуем список имен в набор(Set) имен в верхнем регистре
До Java 8
1 2 3 4 5 6 7 8 9 |
public static void main(String[] args) { List<String> names = Arrays.asList("John", "Arya", "Sansa"); Set<String> upperCaseNames = new HashSet<>(); for (String name : names) { upperCaseNames.add(name.toUpperCase()); } System.out.println(upperCaseNames); //output [ARYA, JOHN, SANSA] } |
Сейчас же мы можем воспользоваться методом map со ссылкой на метод, а так же утилитным классом Collectors
1 2 3 4 5 6 7 8 |
public static void main(String[] args) { List<String> names = Arrays.asList("John", "Arya", "Sansa"); Set<String> upperCaseNames = names.stream() .map(String::toUpperCase) .collect(Collectors.toSet()); System.out.println(upperCaseNames); //output [ARYA, JOHN, SANSA] } |
Collect в сочетании с Collectors.toSet возвращают Set (реализация - HashSet)
4. Collect to Collection
Соберем список не пустых строк в Queue
До Java 8
1 2 3 4 5 6 7 8 9 10 |
public static void main(String[] args) { List<String> names = Arrays.asList("Jaime", "Daenerys", "", "Tyrion", ""); Queue<String> queue = new LinkedList<>(); for (String name : names) { if (!name.isEmpty()) { queue.add(name); } } System.out.println(queue); //output [Jaime, Daenerys, Tyrion] } |
Чтобы проделать то же самое с помощью Stream API необходимо воспользоваться другим методом класса Collections - toCollection
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<String> names = Arrays.asList("Jaime", "Daenerys", "", "Tyrion", ""); Queue<String> queue = names.stream() .filter(n -> !n.isEmpty()) .collect(Collectors.toCollection(() -> new LinkedList<>())); System.out.println(queue); //output [Jaime, Daenerys, Tyrion] } |
Метод toCollection принимает лямбда-выражение типа поставщик (Supplier), которое должно вернуть коллекцию, в которую мы хотим сохранить данные. В данном случае мы вернули LinkedList.
Пример так же можно улучшить с помощю ссылки на метод, изменив
1 |
Collectors.toCollection(() -> new LinkedList<>()) |
На
1 |
Collectors.toCollection(LinkedList::new) |
Финальный вариант
1 2 3 4 5 6 7 |
public static void main(String[] args) { List<String> names = Arrays.asList("Jaime", "Daenerys", "", "Tyrion", ""); Queue<String> queue = names.stream() .filter(n -> !n.isEmpty()) .collect(Collectors.toCollection(LinkedList::new)); System.out.println(queue); //output [Jaime, Daenerys, Tyrion] } |
Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Детальную информацию Вы можете найти у нас на сайте.