Ревью 7. Ревью 7 - Функциональные Интерфейсы, Streams. Чем является Stream в контексте Java 3 Для чего нужен 3
Скачать 84.11 Kb.
|
В чем разница между коллекцией (Collection) и стримом (Stream)?Разница между коллекцией (Collection) данных и потоком (Stream) из новой JDK8 в том, что коллекции позволяют работать с элементами по-отдельности, тогда как поток (Stream) не позволяет. Например, с использованием коллекций, вы можете добавлять элементы, удалять, и вставлять в середину. Также стоит отметить важность самой концепции сущностей: Collection - это прежде всего воплощение Структуры Данных. Например, Set не просто хранит в себе элементы, он реализует идею множества с уникальными элементами, тогда как Stream, это прежде всего абстракция необходимая для реализации конвейера вычислений, собственно, поэтому, результатом работы конвейера являются те или иные Структуры Данных или же результаты проверок/поиска и т.п. Из каких частей состоит использование стримов?- создание стрима; - промежуточные операции (или их отсутствие); - терминальная операция (запускает весь процесс вычисления); Первый этап работы со стримом? Какой второй этап работы со стримом?Первый - создание стрима, второй - промежуточные операции. Какие существуют способы создания стрима?1. Классический: Создание стрима из коллекции collection.stream() Collection Stream 2. Создание стрима из значений Stream.of(значение1,… значениеN) Stream 3. Создание стрима из массива Arrays.stream(массив) String[] array = {"a1","a2","a3"}; Stream 4. Создание стрима из файла (каждая строка в файле будет отдельным элементом в стриме) Files.lines(путь_к_файлу) Stream 5. Создание стрима из строки «строка».chars() IntStream streamFromString = "123".chars() 6. С помощью Stream.builder Stream.builder().add(...)....build() Stream.builder().add("a1").add("a2").add("a3").build() 7. Создание параллельного стрима collection.parallelStream() Stream 8. Создание бесконечных стрима с помощью Stream.iterate Stream.iterate(начальное_условие, выражение_генерации) Stream 9. Создание бесконечных стрима с помощью Stream.generate Stream.generate(выражение_генерации) Stream В каком случае нужно закрывать стрим?Только потоки, источником которых является канал ввода-вывода, например Files.lines(Path, Charset) должны быть закрыты. Остальные реализуют AutoClosable. Можно ли конкатенировать стримы? если да, то каким методом?Объединение с помощью метода .concat(stream1, stream2); Можно ли получить пустой стрим?Пустой стрим: Stream.empty() Как получить стрим из массива?Arrays.stream(массив) Для чего нужен метод collect() в стримах?Метод collect() является конечной операцией, которая используется для представление результата в виде коллекции или какой-либо другой структуры данных. collect() принимает на вход Collector<Тип_источника, Тип_аккумулятора, Тип_результата>, который содержит четыре этапа: supplier - инициализация аккумулятора, accumulator - обработка каждого элемента, combiner - соединение двух аккумуляторов при параллельном выполнении, [finisher] - необязательный метод последней обработки аккумулятора. В Java 8 в классе Collectors реализовано несколько распространённых коллекторов: toList(), toCollection(), toSet() - представляют стрим в виде списка, коллекции или множества; toConcurrentMap(), toMap() - позволяют преобразовать стрим в Map; averagingInt(), averagingDouble(), averagingLong() - возвращают среднее значение; summingInt(), summingDouble(), summingLong() - возвращает сумму; summarizingInt(), summarizingDouble(), summarizingLong() - возвращают SummaryStatistics с разными агрегатными значениями; partitioningBy() - разделяет коллекцию на две части по соответствию условию и возвращает их как Map groupingBy() - разделяет коллекцию на несколько частей и возвращает Map mapping() - дополнительные преобразования значений для сложных Collector-ов. Так же существует возможность создания собственного коллектора через Collector.of(): Collector ArrayList::new, List::add, (l1, l2) -> { l1.addAll(l2); return l1; } ); |