интерфейсы. Интерфейсы. Интерфейсы Функциональные интерфейсы, основные типы
Скачать 25.55 Kb.
|
Интерфейсы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 API5.Что такое Стрим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 Функциональный интерфейс Function 17.Что такое терминальная операция?у stream'a может быть сколько угодно вызовов конвейерных вызовов и в конце один терминальный, при этом все конвейерные методы выполняются лениво и пока не будет вызван терминальный метод никаких действий на самом деле не происходит 20.Где находятся функциональные интерфейсы?в пакете java.util.function 21.Перечислить основные семейства функ. интерфейсов?Функции Обычная обобщенная функция - интерфейс Function Бинарные функции - функции с двумя параметрами и возвращаемым значением. BiFunction Поставщики (Suppliers) Интерфейсы Supplier Потребители (Consumers)Consumer Предикаты Predicate Операторы Унарный (UnaryOperator 22. Чем является Stream в контексте Java? |