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

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

  • Итак, какие анонимные классы можно заменить выражением лямбда

  • А как насчет потребителя

  • В чем разница методов range и rangeClosed Можно ли конкатенировать стримы если да то каким методом Можно ли получить пустой стрим

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

  • Ссылки на материал для ревью. 1 Ревью. Примитивные типы


    Скачать 72.95 Kb.
    Название1 Ревью. Примитивные типы
    АнкорСсылки на материал для ревью
    Дата20.04.2022
    Размер72.95 Kb.
    Формат файлаdocx
    Имя файлаSsylki_na_material_dlya_revyu.docx
    ТипДокументы
    #487632
    страница4 из 4
    1   2   3   4

    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 concat​(Stream a, Stream b): объединяет два потока. Промежуточная операция

    Stream distinct(): возвращает поток, в котором имеются только уникальные данные с типом T. Промежуточная операция

    Stream dropWhile​(Predicate predicate): пропускает элементы, которые соответствуют условию в predicate, пока не попадется элемент, который не соответствует условию. Выбранные элементы возвращаются в виде потока. Промежуточная операция.

    Stream filter(Predicate predicate): фильтрует элементы в соответствии с условием в предикате. Промежуточная операция

    Stream limit(long maxSize): оставляет в потоке только maxSize элементов. Промежуточная операция

    Stream map(Function mapper): преобразует элементы типа T в элементы типа R и возвращает поток с элементами R. Промежуточная операция

    Stream flatMap(Function> mapper): позволяет преобразовать элемент типа T в несколько элементов типа R и возвращает поток с элементами R. Промежуточная операция

    Stream skip(long n): возвращает поток, в котором отсутствуют первые n элементов. Промежуточная операция.

    Stream sorted(): возвращает отсортированный поток. Промежуточная операция.

    Stream sorted(Comparator comparator): возвращает отсортированный в соответствии с компаратором поток. Промежуточная операция.

    Stream takeWhile​(Predicate predicate): выбирает из потока элементы, пока они соответствуют условию в predicate. Выбранные элементы возвращаются в виде потока. Промежуточная операция.

    Object[] toArray(): возвращает массив из элементов потока. Терминальная операция.

    boolean allMatch(Predicate predicate): возвращает true, если все элементы потока удовлетворяют условию в предикате. Терминальная операция

    boolean anyMatch(Predicate predicate): возвращает true, если хоть один элемент потока удовлетворяют условию в предикате. Терминальная операция

    boolean noneMatch(Predicate predicate): возвращает true, если ни один из элементов в потоке не удовлетворяет условию в предикате. Терминальная операция

    Optional max(Comparator comparator): возвращает максимальный элемент из потока. Для сравнения элементов применяется компаратор comparator. Терминальная операция

    Optional min(Comparator comparator): возвращает минимальный элемент из потока. Для сравнения элементов применяется компаратор comparator. Терминальная операция

    R collect(Collector collector): добавляет элементы в неизменяемый контейнер с типом R. T представляет тип данных из вызывающего потока, а A - тип данных в контейнере. Терминальная операция

    long count(): возвращает количество элементов в потоке. Терминальная операция.

    Optional findFirst(): возвращает первый элемент из потока. Терминальная операция

    Optional findAny(): возвращает первый попавшийся элемент из потока. Терминальная операция

    void forEach(Consumer action): для каждого элемента выполняется действие action. Терминальная операция
    1   2   3   4


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