Главная страница
Навигация по странице:

  • 2.Семейства функциональных интерфейсов

  • 4.Как они связаны с анонимным классом

  • Streams API

  • Какие бывают стримы (По разным критериям , например "конечные и бесконечные")

  • 8.Императивный vs Декларативный подход программирования

  • 9.Что такое default методы в интерфейсе и для чего они были введены

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

  • 11.В чем разница между коллекцией(Collection) и потоком(Stream)

  • 13.Какие виды ссылок на методы вы знаете

  • 15.Любой анонимный класс можно заменить на лямбду

  • 22. Чем является Stream в контексте Java- В каком пакете находится Stream

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

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

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

  • интерфейсы. Интерфейсы. Интерфейсы Функциональные интерфейсы, основные типы


    Скачать 25.55 Kb.
    НазваниеИнтерфейсы Функциональные интерфейсы, основные типы
    Анкоринтерфейсы
    Дата14.11.2022
    Размер25.55 Kb.
    Формат файлаdocx
    Имя файлаИнтерфейсы.docx
    ТипДокументы
    #788295

    Интерфейсы

    1.Функциональные интерфейсы, основные типы.


    Функциональный интерфейс в Java - это интерфейс, который содержит только 1 абстрактный метод. (но может содержать любое количество дефолтных методов и может иметь методы класса Object и статические)

    @FunctionalInterface - появилась в Java 8. Генерирует ошибку компиляции если интерфейс не функциональный

    Основное назначение - использование в лямбда выражениях и method reference.

    (
    Основные типы: Работают с объектами , работают с примитивами

    2.Семейства функциональных интерфейсов


    Consumer - void (peek, forEach)
    Supplier - T (generate)
    Predicate - boolean. (filter)
    Function - T -> R (map)
    Operator (Unary-Binary-) - T -> T (iterate)

    3.Что такое лямбда выражение и ссылка на метод.


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

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

    4.Как они связаны с анонимным классом


    Лямбда выражения являются альтернативой анонимным классам. Но они не одинаковы.

    Общее:
    1. Локальные переменные могут быть использованы только если они final или effective final.
    2. Разрешается доступ к переменным класса и статическим переменным класса.
    3. Они не должны выбрасывать больше исключений чем определено в throws метода функционального интерфейса.

    Различия:
    1. Для анонимных классов ключевое слово this ссылается на сам класс. Для лямбды выражений на внешний класс.
    2. Анонимные классы компилируются во внутренние классы. Но лямбда выражения преобразуются в статические private методы класса, в котором они используют invokedynamic инструкцию. Ленивая forболее эффективны, так как не надо загружать еще один класс.

    Streams API

    5.Что такое Стрим


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

    Предоставляет возможность обрабатывать последовательность элементов исполняя одну или несколько операций, которые могут выполняться либо последовательно либо параллельно. Потоки делятся на последовательные и параллельные. Самая большая польза от этого - в работе с коллекциями.Операции над потоком относятся либо к промежуточным, либо к терминальным. Все промежуточные операции возвращают поток, так что мы можем объединять несколько промежуточных операций без использования точки с запятой. Терминальные операции возвращают void или непотоковый результат.

    Какие бывают стримы (По разным критериям, например "конечные и бесконечные")


    Бесконечные (iterate, generate) - создают бесконечный поток данных, до срабатывания условия

    ( Последовательные и ) Параллельные- работают с многоядерностью компьютера

    Объектные и примитивные

    6.Терминальные и промежуточные методы


    Промежуточные ("intermediate", ещё называют "lazy") — обрабатывают поступающие элементы и возвращают стрим. Промежуточных операторов в цепочке обработки элементов может быть много.
    .filter() .map() .flatMap() .sorted() .limit() .skip()

    Терминальные ("terminal", ещё называют "eager") — обрабатывают элементы и завершают работу стрима, так что терминальный оператор в цепочке может быть только один.
    .forEach() .count() .collect(Collector collect) .reduce() .findFirst()

    7.Способы получения стрима


    1. Пустой стрим: Stream.empty()
    2. Стрим из указ элементов: Stream.of("1", "2", "3")
    3. Стрим из массива: Arrays.stream(array)
    4. Стрим из List: list.stream()
    5. Стрим из Map: map.entrySet().stream()
    6. Стрим из файла (каждая строка в файле будет отдельным элементом в стриме): Files.lines(путь_к_файлу)
    7. С помощью Stream.builder: Stream.builder().add(...)....build()
    8. Бесконечный стрим с помощью Stream.iterate: Stream.iterate(начальное_условие, выражение_генерации)
    9. Бесконечных стрим с помощью Stream.generate
    10. Параллельный стрим: collection.parallelStream()

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


    Императивный с кишками, декларативный - описание (класс - анон. класс - лямбда - ссылка на метод)

    9.Что такое default методы в интерфейсе и для чего они были введены?


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

    Для добавления нового метода в интерфейс приходилось править все классы, реализующие интерфейс - реализовывать метод в этих классах. Так что ввели ключевое слово default и эти методы сделали default.
    Например, в интерфейсе java.lang.Iterable появились новые default-методы forEach()и spliterator():

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


    Лямбда-выражения имеют доступ к переменным области видимости, в которой их определили. Но доступ возможен только при условии, что переменные являются effective final, то есть либо явно имеют модификатор final, либо не меняют своего значения после инициализации, если переменной присваивается значение во второй раз, лямбда-выражение вызывает ошибку компиляции.

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


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

    Стримы могут быть бесконечные
    Коллекции предназначены для хранения данных

    12.Что такое Optional?


    Optional - это контейнер объекта, он может содержать значение или некоторый тип Т, или просто быть null. Он предоставляет много полезных методов избавляющие от добавления повторяющихся if null/notNull проверок, что позволяет нам сфокусироваться на том, что мы хотим сделать.Метод isPresent() возвращает true если экземпляр Optional содержит не null значение и false в противном случае. Метод orElseGet() содержит запасной механизм результата, если Optional содержит null, принимая функции для генерации значения по умолчанию. Метод map() преобразует текущее значение Optional и возвращает новый экземпляр Optional. Метод orElse() похож на orElseGet(), но вместо функции он принимает значение по умолчанию.

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


    Существует четыре вида ссылок на методы:
    - Ссылка на статический метод(ContainingClass::staticMethodName)
    - Ссылка на метод конкретного объекта(ContainingObject::instanceMethodName) - Ссылка на метод произвольного объекта конкретного типа(ContainingType::methodName)
    - Ссылка на конструктор(ClassName::new), для дженериков (generics) Class< T >::new.

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


    Интерфейс Comparable используется только для сравнения объектов класса, в котором данный интерфейс реализован. Т.е. interface Comparable определяет логику сравнения объекта определенного ссылочного типа внутри своей реализации (по правилам разработчика).
    Comparator представляет отдельную реализацию и ее можно использовать многократно и с различными классами. Т.е. interface Comparator позволяет создавать объекты, которые будут управлять процессом сравнения (например при сортировках).

    15.Любой анонимный класс можно заменить на лямбду?


    Нет - только тот анонимный класс, который будет имплементировать функциональный Interface

    16.Отличие BinaryOperator от Function.


    BinaryOperator принимает в качестве параметра два объекта типа T, выполняет над ними бинарную операцию и возвращает ее результат также в виде объекта типа T:

    Функциональный интерфейс Function представляет функцию перехода от объекта типа T к объекту типа R:

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


    у stream'a может быть сколько угодно вызовов конвейерных вызовов и в конце один терминальный, при этом все конвейерные методы выполняются лениво и пока не будет вызван терминальный метод никаких действий на самом деле не происходит

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


    в пакете java.util.function

    21.Перечислить основные семейства функ. интерфейсов?


    Функции
    Обычная обобщенная функция - интерфейс Function. Принимает параметр и возвращает значение другого типа. Для примитивов есть не-generic специализации - семейство интерфейсов XtoYFunction. (Здесь и далее вместо X и Y подставляются названия примитивов).
    Бинарные функции - функции с двумя параметрами и возвращаемым значением. BiFunction, ToXBiFunction.

    Поставщики (Suppliers)
    Интерфейсы Supplier, XSupplier - не принимают ничего, возвращают (поставляют) значение.

    Потребители (Consumers)Consumer, XConsumer - принимают (потребляют) значение, ничего не возвращают.Бинарный вариант, BiConsumer и XYConsumer, потребляет два параметра.

    Предикаты
    Predicate, XPredicate - принимают параметр, возвращают boolean. Кроме самой функции содержат дефолтные реализации логических операций.

    Операторы
    Унарный (UnaryOperator) и бинарный (BinaryOperator) - просто функция и би-функция с одинаковым типом параметров и результата. Специализации для примитивов XUnaryOperator и XBinaryOperator вдобавок содержат дефолтные реализации методов для композиции операторов.

    22. Чем является Stream в контексте Java?
    - В каком пакете находится Stream?


    - Stream API — это способ работать со структурами данных в функциональном стиле.
    - java.util.stream

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


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

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


    если стрим выделял какие то системные ресурсы (работа с файлами или директориями), чтобы избежать утечек ресурса

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


    диапазон, не включая последнее число, включая


    написать администратору сайта