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

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

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

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

Добавлен: 30.04.2024

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

Скачиваний: 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 кодировщик и декодировщик?



неизменяемые (r - не обязательно помеченные как final) локальные переменные;

поля класса;

статические переменные.

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

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


public static List sort(List list){

Collections.sort(list, (a, b) -> a.compareTo(b));

return list;

}

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


Метод filter() является промежуточной операцией принимающей предикат, который фильтрует все элементы, возвращая только те, что соответствуют условию.

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


Метод limit() является промежуточной операцией, которая позволяет ограничить выборку определенным количеством первых элементов.

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


Метод sorted() является промежуточной операцией, которая позволяет сортировать значения либо в натуральном порядке, либо задавая Comparator.

Порядок элементов в исходной коллекции остается нетронутым - sorted() всего лишь создает его отсортированное представление.

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


Метод flatMap() похож на map, но может создавать из одного элемента несколько. Таким образом, каждый объект будет преобразован в ноль, один или несколько других объектов, поддерживаемых потоком. Наиболее очевидный способ применения этой операции — преобразование элементов контейнера при помощи функций, которые возвращают контейнеры.

Stream

.of("H e l l o", "w o r l d !")


.flatMap((p) -> Arrays.stream(p.split(" ")))

.toArray(String[]::new);//["H", "e", "l", "l", "o", "w", "o", "r", "l", "d", "!"]

flatMapToInt(), flatMapToDouble(), flatMapToLong() - это аналоги flatMap(), возвращающие соответствующий числовой стрим.

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

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


Если лямбда выражения вызывают только один существующий метод, лучше ссылать на этот метод по его имени. Ссылки на методы (Method References) – это компактные лямбда выражения для методов, у которых уже есть имя. Например:

Consumer consumer = str -> System.out.println(str);

можно переписать с помощью method references:

Consumer consumer = System.out::println;

Результат будет в точности таким же, как в случае определения лямбда-выражения, которое вызывает этот метод.

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


Если заменить лямбду на ссылку на метод, то байткод класса будет компактнее, а значит, класс быстрее загрузится в JVM. Однако для того, чтобы ощутить такой прирост, нужны тысячи неоптимизированных лямбд. Тем не менее, в крупном проекте такое количество наберется легко.

В остальном выбор между лямбдой и ссылкой на метод — вопрос вкуса и читаемости кода. Например, если в лямбде несколько строк, то читаемость снижается, и код только выиграет, если лямбду вынести в отдельный метод, и использовать ссылку на него.

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

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


В Java различают 4 вида ссылок на методы:

ссылки на статические методы;

ссылки на методы экземпляра;

ссылки на конструкторы;

ссылки на обобщенные (шаблонные) методы.

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


- имя_класса:: имя_стат_метода
(для статического метода);

- объект_класса:: имя_метода (для метода экземпляра);

- название_класса:: new (для конструктора).

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

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


Основная особенность - анонимный класс не имеет имени. Анонимный класс является подклассом существующего класса или реализации интерфейса, т.е. АК всегда от кого-то наследуется.

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

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

Объявление такого класса выполняется одновременно с созданием его объекта посредством использования оператора new. Синтаксис: после оператора new вызывается конструктор класса (в случае обычного наследования) или указывается абстрактный класс или интерфейс, после которого следуют пустые круглые скобки (в случае реализации), затем в фигурных скобках описывается реализация. После фигурных скобок тела анонимного класса обязательно ставить точку с запятой.

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


Ответ - нет. Вы можете создать анонимный класс для не заключительных классов и интерфейсов. Не то же самое для лямбда-выражений. Они могут использоваться только там, где ожидается интерфейс SAM, т.е. интерфейсы только с одним абстрактным методом (до Java 8 каждый метод интерфейса был абстрактным, но поскольку интерфейсы Java 8 могут также иметь стандартные и статические методы, которые не являются абстрактными, поскольку они имеют реализацию). Итак, какие анонимные классы можно заменить выражением лямбда? Только анонимные классы, которые являются реализациями интерфейса SAM (например, Runnable, ActionListener, Comparator, Predicate), могут быть заменены выражением лямбда. DefaultConsumer не может быть лямбда-мишенью, потому что это даже не интерфейс. А как насчет потребителя? Несмотря на то, что Consumer является интерфейсом, он не является интерфейсом SAM, потому что он содержит более одного абстрактного метода, t и лямбда-мишень.