Файл: Чем является Stream в контексте Java 3 Для чего нужен 3.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 30.04.2024

Просмотров: 48

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Оглавление

Чем является Stream в контексте Java?

Для чего нужен?

Какие бывают стримы?

Что такое ленивая инициализация стрима?

Что возвращают промежуточные операции над стримом?

Что такое терминальная операция?

Две терминальные операции в одном выражении?

Что возвращают промежуточные операции над стримом?

В каком пакете находится Stream?

Чем Stream отличается от итератора?

В чем разница между коллекцией (Collection) и стримом (Stream)?

Из каких частей состоит использование стримов?

Первый этап работы со стримом? Какой второй этап работы со стримом?

Какие существуют способы создания стрима?

Что такое коллекторы?

Для чего в стримах предназначены методы map() и mapToInt(), mapToDouble(), mapToLong()?

В чем разница map и flatMap?

Приведи пример терминальной и промежуточной операции над стримом?

Лямбда:

Какова структура и особенности использования лямбда-выражения?

Что такое лямбда? Как взаимосвязаны лямбда и функциональный интерфейс?

Может ли лямбда-выражение быть в несколько строк?

К каким переменным и как можно обращаться в теле лямбда-выражений?

Как отсортировать список строк с помощью лямбда-выражения?

Какова цель метода filter() в стримах?

Для чего в стримах предназначен метод limit()?

Для чего в стримах предназначен метод sorted()?

Для чего в стримах предназначены методы flatMap(), flatMapToInt(), flatMapToDouble(), flatMapToLong()?

Ссылка на метод

Что такое Method References (ссылка на метод)?

Разница между ссылкой на метод и лямбдой?

Какие виды ссылок на методы вы знаете?

В каком виде передается Method References (ссылка на метод)?

Анонимные классы

Анонимные классы, как создать, где применяются, особенно как создать экземпляр?

Можно ли заменить каждый анонимный класс выражением лямбда?

Функциональные интерфейсы

Что такое функциональные интерфейсы? Для чего нужны?

Какой аннотацией помечается функциональный интерфейс?

Может ли функциональный интерфейс содержать что-то кроме абстрактного метода?

Что такое default методы?

Как вызывать default метод интерфейса в реализующем этот интерфейс классе?

Что такое static метод интерфейса?

Как вызывать static метод интерфейса?

Где находятся функциональные интерфейсы?

Сколько дефолтных методов и статических методов, статических полей в функциональном интерфейсе?

Основные типы функциональных интерфейсов.

Расскажите про Comparator и Comparable?

Какие есть способы инстанцировать функциональные интерфейсы?

Отличие BinaryOperator от Function

Все способы реализации функционального интерфейса?

Разное

Императивный vs декларативный подход.

Декларативный стиль

Функциональное программирование- плюсы минусы, где применяется.

Что такое StringJoiner?

Что такое Optional?

Как вывести на экран 10 случайных чисел, используя forEach()?

Как можно вывести на экран уникальные квадраты чисел используя метод map()?

Как вывести на экран количество пустых строк с помощью метода filter()?

Как вывести на экран 10 случайных чисел в порядке возрастания?

Как найти максимальное число в наборе?

Как найти минимальное число в наборе?

Как получить сумму всех чисел в наборе?

Как получить среднее значение всех чисел?

Какие дополнительные методы для работы с ассоциативными массивами (maps) появились в Java 8?

Что такое LocalDateTime?

Что такое ZonedDateTime?

Как получить текущую дату с использованием Date Time API из Java 8?

Как добавить 1 неделю, 1 месяц, 1 год, 10 лет к текущей дате с использованием Date Time API?

Как получить следующий вторник используя Date Time API?

Как получить вторую субботу текущего месяца используя Date Time API?

Как получить текущее время с точностью до миллисекунд используя Date Time API?

Как получить текущее время по местному времени с точностью до миллисекунд используя Date Time API?

Как определить повторяемую аннотацию?

Что такое Nashorn?

Что такое jjs?

Какой класс появился в Java 8 для кодирования/декодирования данных?

Как создать Base64 кодировщик и декодировщик?



Оглавление


Чем является Stream в контексте Java? 3

Для чего нужен? 3

Какие бывают стримы? 3

Что такое ленивая инициализация стрима? 4

Что возвращают промежуточные операции над стримом? 4

Что такое терминальная операция? 4

Две терминальные операции в одном выражении? 4

Что возвращают промежуточные операции над стримом? 4

В каком пакете находится Stream? 4

Чем Stream отличается от итератора? 4

В чем разница между коллекцией (Collection) и стримом (Stream)? 5

Из каких частей состоит использование стримов? 5

Первый этап работы со стримом? Какой второй этап работы со стримом? 5

Какие существуют способы создания стрима? 5

В каком случае нужно закрывать стрим? 6

Можно ли конкатенировать стримы? если да, то каким методом? 6

Можно ли получить пустой стрим? 6

Как получить стрим из массива? 6

Для чего нужен метод collect() в стримах? 6

Что такое коллекторы? 7

Для чего в стримах предназначены методы map() и mapToInt(), mapToDouble(), mapToLong()? 7

В чем разница map и flatMap? 7

Методы peek и forEach - в чем разница? 7

В чем разница между forEach и forEachOrdered? 7

Разница методов. list() и walk()? 7

Что такое саплайер-поставщик? 7

Как получить стрим диапазона чисел? 7

В чем разница методов range и rangeClosed? 8

Может ли стрим использоваться повторно? 8

Расскажите о параллельной обработке в Java 8. 8

Приведи пример терминальной и промежуточной операции над стримом? 9

Лямбда: 10

Какова структура и особенности использования лямбда-выражения? 10

Что такое лямбда? Как взаимосвязаны лямбда и функциональный интерфейс? 12

Может ли лямбда-выражение быть в несколько строк? 13

К каким переменным и как можно обращаться в теле лямбда-выражений? 13

Как отсортировать список строк с помощью лямбда-выражения? 13

Какова цель метода filter() в стримах? 13

Для чего в стримах предназначен метод limit()? 13

Для чего в стримах предназначен метод sorted()? 13

Для чего в стримах предназначены методы flatMap(), flatMapToInt(), flatMapToDouble(), flatMapToLong()? 13

Ссылка на метод 14

Что такое Method References (ссылка на метод)? 14

Разница между ссылкой на метод и лямбдой? 14

Какие виды ссылок на методы вы знаете? 14

В каком виде передается Method References (ссылка на метод)? 14

Анонимные классы 15

Анонимные классы, как создать, где применяются, особенно как создать экземпляр? 15

Можно ли заменить каждый анонимный класс выражением лямбда? 15

Функциональные интерфейсы 15

Что такое функциональные интерфейсы? Для чего нужны? 15

Какой аннотацией помечается функциональный интерфейс? 15

Может ли функциональный интерфейс содержать что-то кроме абстрактного метода? 16

Что такое default методы? 16

Как вызывать default метод интерфейса в реализующем этот интерфейс классе? 16

Что такое static метод интерфейса? 17

Как вызывать static метод интерфейса? 17

Где находятся функциональные интерфейсы? 17

Сколько дефолтных методов и статических методов, статических полей в функциональном интерфейсе? 17

Основные типы функциональных интерфейсов. 18

Расскажите про Comparator и Comparable? 18

Какие есть способы инстанцировать функциональные интерфейсы? 18

Отличие BinaryOperator от Function 18

Все способы реализации функционального интерфейса? 18

Разное 19

Императивный vs декларативный подход. 19

Декларативный стиль 19

Функциональное программирование- плюсы минусы, где применяется. 19

Что такое StringJoiner? 19

Что такое Optional? 19

Как вывести на экран 10 случайных чисел, используя forEach()? 20

Как можно вывести на экран уникальные квадраты чисел используя метод map()? 20

Как вывести на экран количество пустых строк с помощью метода filter()? 20

Как вывести на экран 10 случайных чисел в порядке возрастания? 20

Как найти максимальное число в наборе? 20

Как найти минимальное число в наборе? 20

Как получить сумму всех чисел в наборе? 20

Как получить среднее значение всех чисел? 20

Какие дополнительные методы для работы с ассоциативными массивами (maps) появились в Java 8? 20

Что такое LocalDateTime? 21

Что такое ZonedDateTime? 21

Как получить текущую дату с использованием Date Time API из Java 8? 21

Как добавить 1 неделю, 1 месяц, 1 год, 10 лет к текущей дате с использованием Date Time API? 21

Как получить следующий вторник используя Date Time API? 21

Как получить вторую субботу текущего месяца используя Date Time API? 21

Как получить текущее время с точностью до миллисекунд используя Date Time API? 22

Как получить текущее время по местному времени с точностью до миллисекунд используя Date Time API? 22

Как определить повторяемую аннотацию? 22

Что такое Nashorn? 22

Что такое jjs? 22

Какой класс появился в Java 8 для кодирования/декодирования данных? 22

Как создать Base64 кодировщик и декодировщик? 23




Чем является Stream в контексте Java?


Интерфейс java.util.Stream представляет собой последовательность элементов, над которой можно производить различные операции.

Stream API — это новый способ работать со структурами данных в функциональном стиле. Stream (поток) API (описание способов, которыми одна компьютерная программа может взаимодействовать с другой программой) — это по своей сути поток данных. Сам термин "поток" довольно размыт в программировании в целом и в Java в частности.

Для чего нужен?


С появлением Java 8 Stream API позволило программистам писать существенно короче то, что раньше занимало много строк кода, а именно — упростить работу с наборами данных, в частности, упростить операции фильтрации, сортировки и другие манипуляции с данными. Если у вас промежуточных операций нет, часто можно и нужно обойтись без стрима, иначе код будет сложнее чем без потока.

Какие бывают стримы?


Java Stream API предлагает два вида методов:

1. Конвейерные — возвращают другой stream, то есть работают как builder,

2. Терминальные — возвращают другой объект, такой как коллекция, примитивы, объекты, Optional и т.д.

Общее правило: у stream'a может быть сколько угодно вызовов конвейерных вызовов и в конце один терминальный, при этом все конвейерные методы выполняются лениво и пока не будет вызван терминальный метод никаких действий на самом деле не происходит, так же как создать объект Thread или Runnable, но не вызвать у него start.

2) последовательные и параллельные;

Стримы бывают последовательными (sequential) и параллельными (parallel). Последовательные выполняются только в текущем потоке, а вот параллельные используют общий пул ForkJoinPool.commonPool(). При этом элементы разбиваются (если это возможно) на несколько групп и обрабатываются в каждом потоке отдельно. Затем на нужном этапе группы объединяются в одну для предоставления конечного результата.

Чтобы получить параллельный стрим, нужно либо вызвать метод parallelStream() вместо stream(), либо превратить обычный стрим в параллельный, вызвав промежуточный оператор parallel.


  1. объектные и примитивные;

Специальные типы стримов для примитивных типов:

- LongStream(),

- DoubleStream(),

- IntStream().

Что такое ленивая инициализация стрима?


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

Что возвращают промежуточные операции над стримом?


Промежуточные операции возвращают трансформированный поток. К возвращенному потоку также можно применить ряд промежуточных операций, либо терминальную операцию.

Что такое терминальная операция?


Конечные или терминальные операции возвращают конкретный результат. После этого никаких промежуточных операций применять нельзя.

Две терминальные операции в одном выражении?


нет

Что возвращают промежуточные операции над стримом?


Промежуточные операции возвращают трансформированный стрим. Конечные или терминальные операции возвращают конкретный результат.

В каком пакете находится Stream?


Вся основная функциональность данного API сосредоточена в пакете java. util. stream.

Чем Stream отличается от итератора?


Порядок в обходе от итератора может быть задан и заранее определен. Стоимость (затраты мощностей процессора) доступа к элементам в стримах гораздо ниже. Протокол Iterator принципиально менее эффективен. Для получения каждого элемента требуется вызов двух методов. Кроме того, поскольку итераторы должны быть устойчивы к таким вещам, как вызов next() без hasNext() или hasNext() несколько раз без next(), оба этих метода обычно должны выполнять некоторую защитную кодировку ( и, как правило, больше состояния и ветвления), что увеличивает неэффективность.

В чем разница между коллекцией (Collection) и стримом (Stream)?


Разница между коллекцией (Collection) данных и потоком (Stream) из новой JDK8 в том, что коллекции позволяют работать с элементами по-отдельности, тогда как поток (Stream) не позволяет. Например, с использованием коллекций, вы можете добавлять элементы, удалять, и вставлять в середину.

Также стоит отметить важность самой концепции сущностей: Collection - это прежде всего воплощение Структуры Данных. Например, Set не просто хранит в себе элементы, он реализует идею множества с уникальными элементами, тогда как Stream, это прежде всего абстракция необходимая для реализации конвейера вычислений, собственно, поэтому, результатом работы конвейера являются те или иные Структуры Данных или же результаты проверок/поиска и т.п.

Из каких частей состоит использование стримов?


- создание стрима;

- промежуточные операции (или их отсутствие);

- терминальная операция (запускает весь процесс вычисления);

Первый этап работы со стримом? Какой второй этап работы со стримом?


Первый - создание стрима, второй - промежуточные операции.

Какие существуют способы создания стрима?


1. Классический: Создание стрима из коллекции collection.stream()

Collection collection = Arrays.asList("a1", "a2", "a3");

Stream streamFromCollection = collection.stream();

2. Создание стрима из значений Stream.of(значение1,… значениеN)

Stream streamFromValues = Stream.of("a1", "a2", "a3");

3. Создание стрима из массива Arrays.stream(массив)

String[] array = {"a1","a2","a3"};

Stream streamFromArrays = Arrays.stream(array);

4. Создание стрима из файла (каждая строка в файле будет отдельным элементом в стриме) Files.lines(путь_к_файлу)

Stream streamFromFiles = Files.lines(Paths.get("file.txt"))

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 stream = collection.parallelStream();

8. Создание бесконечных стрима с помощью Stream.iterate

Stream.iterate(начальное_условие, выражение_генерации)

Stream streamFromIterate = Stream.iterate(1, n -> n + 1)

9. Создание бесконечных стрима с помощью Stream.generate Stream.generate(выражение_генерации)

Stream streamFromGenerate = Stream.generate(() -> "a1")

В каком случае нужно закрывать стрим?


Только потоки, источником которых является канал ввода-вывода, например 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, List> toList = Collector.of(

ArrayList::new,

List::add,

(l1, l2) -> { l1.addAll(l2); return l1; }

);