Ссылки на материал для ревью. 1 Ревью. Примитивные типы
Скачать 72.95 Kb.
|
6 Ревью. Функциональные Интерфейсы. Streams https://quizlet.com/kr/561750099/%D1%84%D1%83%D0%BD%D0%BA%D1%86-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D1%8B-%D1%81%D1%82%D1%80%D0%B8%D0%BC-java-flash-cards/ http://topuch.ru/1-funkcionalenie-interfejsi-osnovnie-tipi/index.html#pages https://share.mindmanager.com/#publish/5n7fduLav72iOoxaqxN0dW6dZ184ciESFMDpUXkw Stream API в видео (11 часов) - https://www.youtube.com/playlist?list=PLtNPgSbW9TX5IQAKzgrJnaayjaDoCjkio https://www.youtube.com/watch?v=FCT2jbAs_uA (2 часа) - стримы. Использование лямбда выражений – https://www.youtube.com/watch?v=ztraQ9chIUE&feature=youtu.be&ab_channel=SoftwareArchitectAlexKorolev https://www.youtube.com/watch?v=k7PlG32BzI8&ab_channel=%D0%A3%D1%80%D0%BE%D0%BA%D0%B8Java- class Optional Java8 - https://github.com/timmson/java-interview/blob/master/006-java8.md полное руководство по Stream API - https://annimon.com/article/2778 http://javatutor.net/articles/anonymyous-classes-in-java - анонимные классы. https://metanit.com/java/tutorial/9.1.php - лямбды https://habr.com/ru/company/luxoft/blog/270383/- Stream API Функциональное программирование- плюсы минусы, где применяется – Функциональное программирование помогает сделать код более понятным, предсказуемым и легким для чтения. Использование принципов функционального программирования помогает избавиться от ненужных абстракций с непредсказуемым поведением, поэтому сделать программу более предсказуемой и уменьшить количество возможных ошибок. ООП-подход подразумевает написание базовых классов и расширение существующих путем добавления к ним методов. Данные хранятся в экземпляре класса вместе с методами, которые ими оперируют. Функции в ООП зависят от внешних данных (например, содержат внутри себя ссылки на глобальные переменные) или коммуницируют с внешним миром (ввод-вывод). В отличие от ООП, функциональное программирование характеризуется слабой связью функции с данными, которыми она оперирует. Это позволяет избежать побочных эффектов при выполнении функций — например чтения и изменения глобальных переменных, операций ввода-вывода и так далее. Детерминированные функции ФП возвращают один и тот же результат для одних и тех же аргументов. Самое большое преимущество функционального программирования-краткость, потому что код может быть более кратким. Функциональная программа не создает переменную итератора в качестве центра цикла, поэтому этот и другие виды накладных расходов исключаются из вашего кода. Другим важным преимуществом является параллелизм, что легче сделать с функциональным программированием, поскольку компилятор заботится о большинстве операций, которые раньше требовали ручной настройки переменных состояния (например, итератора в цикле). анонимные классы, как создать, где применяются, особенно как создать экземпляр - https://ru.hexlet.io/courses/java_101/lessons/anonymous/theory_unit императивный vs декларативный подход - Декларативные компьютерные языки часто не полны по Тьюрингу, так как теоретически не всегда возможно порождение исполняемого кода по декларативному описанию. Императивное программирование — это парадигма программирования, в которой задаётся последовательность действий, необходимых для получения результата. Декларативный стиль Такой стиль, в котором вы описываете, какой именно результат вам нужен. И получатель такого сообщения уже сам разбирается, какие шаги для этого надо предпринять. https://www.youtube.com/watch?v=MYbPJj2BFUw https://www.youtube.com/watch?v=oC2p0t2R9ZQ Можно ли заменить каждый анонимный класс выражением лямбда? Ответ - нет. Вы можете создать анонимный класс для не заключительных классов и интерфейсов. Не то же самое для лямбда-выражений. Они могут использоваться только там, где ожидается интерфейс SAM, т.е. Интерфейсы только с одним абстрактным методом (до Java 8 каждый метод интерфейса был абстрактным, но поскольку интерфейсы Java 8 могут также иметь стандартные и статические методы, которые не являются абстрактными, поскольку они имеют реализацию). Итак, какие анонимные классы можно заменить выражением лямбда? Только анонимные классы, которые являются реализациями интерфейса SAM (например, Runnable, ActionListener, Comparator, Predicate), могут быть заменены выражением лямбда. DefaultConsumer не может быть лямбда-мишенью, потому что это даже не интерфейс. А как насчет потребителя? Несмотря на то, что Consumer является интерфейсом, он не является интерфейсом SAM, потому что он содержит более одного абстрактного метода, t и лямбда-мишень. Расскажите про Comparator и Comparable? https://metanit.com/java/tutorial/5.6.php Что такое ленивая инициализация стрима? - Ленивая инициализация-это концепция отсрочки создания объекта до тех пор, пока объект не будет фактически впервые использован. При правильном использовании это может привести к значительному повышению производительности. Все промежуточные операции выполняются только тогда, когда есть терминальная операция. Две терминальные операции в одном выражении? - нет Что возвращают промежуточные операции над стримом? - Промежуточные операции возвращают трансформированный поток. Например, выше в примере метод filter принимал поток чисел и возвращал уже преобразованный поток, в котором только числа больше 0. ... Конечные или терминальные операции возвращают конкретный результат. Для чего нужны параллельные стримы? - Распараллеливание потоков позволяет задействовать несколько ядер процессора (если целевая машина многоядерная) и тем самым может повысить производительность и ускорить вычисления. В то же время говорить, что применение параллельных потоков на многоядерных машинах однозначно повысит производительность - не совсем корректно. В каждом конкретном случае надо проверять и тестировать. Чтобы сделать обычный последовательный поток параллельным, надо вызвать у объекта Stream метод parallel. Кроме того, можно также использовать метод parallelStream() интерфейса Collection для создания параллельного потока из коллекции. В то же время если рабочая машина не является многоядерной, то поток будет выполняться как последовательный. Какой аннотацией помечается функциональный интерфейс? - Аннотация @FunctionalInterface не является чем-то сверхсложным и важным, так как её предназначение — сообщить компилятору, что данный интерфейс функциональный и должен содержать не более одного метода. Если же в интерфейсе с данной аннотацией более одного не реализованного (абстрактного) метода, компилятор не пропустит данный интерфейс, так как будет воспринимать его как ошибочный код. Интерфейсы и без данной аннотации могут считаться функциональными и будут работать, а @FunctionalInterface является не более чем дополнительной страховкой. Где находятся функциональные интерфейсы? Что они принимают и что возвращают? - Многие функциональные интерфейсы, предоставляемые Java8, находятся в пакете java. util. function (что возвращают и какие есть – в статьях выше) Какие есть способы инстанцировать функциональные интерфейсы? - создать экземпляр анонимного или именованного класса, реализующего интерфейс Function; воспользоваться ссылкой на метод; написать лямбда-выражение К каким переменным и как можно обращаться в теле лямбда-выражений? - Изнутри лямбда-выражения можно не только обращаться ко всем «видимым» переменным, но и вызывать те методы, к которым есть доступ. Чем является Stream в контексте Java? - Stream API — это новый способ работать со структурами данных в функциональном стиле. Stream (поток) API (описание способов, которыми одна компьютерная программа может взаимодействовать с другой программой) — это по своей сути поток данных. Сам термин "поток" довольно размыт в программировании в целом и в Java в частности. В каком пакете находится Stream? - Вся основная функциональность данного API сосредоточена в пакете java. util. stream. Чем Stream отличается от итератора? – порядок в обходе от итератора может быть задан и заранее определен. Стоимость (затраты мощностей процессора) доступа к элементам в стримах гораздо ниже Протокол Iteratorпринципиально менее эффективен. Для получения каждого элемента требуется вызов двух методов. Кроме того, поскольку итераторы должны быть устойчивы к таким вещам, как вызов next() без hasNext() или hasNext() несколько раз без next(), оба этих метода обычно должны выполнять некоторую защитную кодировку ( и, как правило, больше состояния и ветвления), что увеличивает неэффективность. Сравнение стримов с коллекцией? - Разница между коллекцией(Collection) данных и потоком(Stream) из новой JDK8 в том что коллекции позволяют работать с элементами по-отдельности, тогда как поток(Stream) не позволяет. Например, с использованием коллекций, вы можете добавлять элементы, удалять, и вставлять в середину. В каком случае нужно закрывать стрим? - Только потоки, источником которых является канал ввода-вывода, например Files.lines(Path, Charset) должны быть закрыты. Остальные реализуют AutoClosable Разница методов. list() и walk()? Что такое саплайер-поставщик? - Files.list() возвращает массив файлов в указанной директории Files.walk() возвращает поток файлов в указанной директории и субдиректориях. Интерфейс Supplier используется тогда, когда на вход не передаются значения, но необходимо вернуть результат. Как получить стрим диапазона чисел? - IntStream.range(0, 10) .collect(Collectors.toList()); В чем разница методов range и rangeClosed? Можно ли конкатенировать стримы? если да то каким методом? Можно ли получить пустой стрим? Первый этап работы со стримом? Какой второй этап работы со стримом? Что такое коллекторы? Что такое метод референс? Может ли лямбда-выражение быть в несколько строк? Может ли функциональный интерфейс содержать что-то кроме абстрактного метода? Может ли стрим использоваться повторно? 1. Приведи пример терминальной и промежуточной операции над стримом? Stream Stream Stream Stream Stream Stream Stream Stream Stream Object[] toArray(): возвращает массив из элементов потока. Терминальная операция. boolean allMatch(Predicate super T> predicate): возвращает true, если все элементы потока удовлетворяют условию в предикате. Терминальная операция boolean anyMatch(Predicate super T> predicate): возвращает true, если хоть один элемент потока удовлетворяют условию в предикате. Терминальная операция boolean noneMatch(Predicate super T> predicate): возвращает true, если ни один из элементов в потоке не удовлетворяет условию в предикате. Терминальная операция Optional Optional long count(): возвращает количество элементов в потоке. Терминальная операция. Optional Optional void forEach(Consumer super T> action): для каждого элемента выполняется действие action. Терминальная операция |