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

  • 76) Что такое ленивая инициализация стрима 77) Любой анонимный класс можно заменить на лямбду

  • 78) Расскажите про Comparator и Comparable 79) Все способы реализации функционального интерфейса

  • 92) В чем разница между интерфейсами Comparable и Comparator

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


    Скачать 184 Kb.
    Название1 Функциональные интерфейсы, основные типы
    Дата05.12.2022
    Размер184 Kb.
    Формат файлаdoc
    Имя файлабилеты модуль 7.doc
    ТипДокументы
    #828359
    страница4 из 4
    1   2   3   4

    73) Как можно классифицировать стримы в разных контекстах?


    75) как взаимосвязаны лямбда и функциональный интерфейс?

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


    76) Что такое ленивая инициализация стрима?


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

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


    78) Расскажите про Comparator и Comparable?


    79) Все способы реализации функционального интерфейса?

    4 способа


    80) Приведи пример терминальной и промежуточной операции над стримом?


    81) В чем разница map и flatMap?

    И map и [flatMap могут быть применены к стриму Stream и оба возвращают стрим Stream. Разница заключается в том,

    что операция map создает одно выходное значение для каждого входного значения, тогда как операция flatMap

    создает произвольное число(ноль или больше) значений для каждого входного значения.
    Операция [map(О работе map на русском) в качестве аргумента принимает Function(например, лямбду),

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

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

    применяет ее к каждому элементу, и на выходе возвращает стрим с одним, несколькими или ни c одним из элементов

    для каждого элемента входящего стрима.
    Т.е., flatMap возвращает по стриму для каждого объекта в первоначальном стриме,

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

    Оба map и flatMap могут быть применены к Stream, и оба они возвращают a Stream. Разница в том,

    что операция map создает одно выходное значение для каждого входного значения,

    тогда как операция flatMap производит произвольное число (ноль или более) значений для каждого входного значения.
    Это отражается в аргументах каждой операции.
    Операция map занимает Function, которая вызывается для каждого значения во входном потоке и выдает одно значение результата,

    которое отправляется в выходной поток.

    Операция flatMap принимает функцию, которая концептуально хочет потреблять одно значение и производить

    произвольное количество значений. Однако в Java это громоздко для метода для возврата произвольного количества значений,

    поскольку методы могут возвращать только ноль или одно значение. Можно представить API, в котором функция mapper

    для flatMap принимает значение и возвращает массив или List значений, которые затем отправляются на выход.

    Учитывая, что это библиотека потоков, особенно подходящим способом представления произвольного количества возвращаемых значений

    является то, что сама функция mapper возвращает поток! Значения из потока, возвращаемого преобразователем, выводятся из потока и

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

    вообще не различаются в выходном потоке, поэтому выход считается "сплющенным".
    Типичное использование функции mapper flatMap для возврата Stream.empty(),

    если оно хочет отправить нулевые значения или что-то вроде Stream.of(a, b, c), если оно хочет вернуть несколько значений.

    Но, конечно, любой поток может быть возвращен.

    82) Зачем нужны default методы в функциональном интерфейсе - тут про обратную совместимость.

    83) Все способы реализации [ФИ: 4 штуки: ссылка на метод, лямбда, через анонимный класс, через обычную имплементацию в классе.

    84) к каким переменным можно обращаться внутри лямбды: переменные внутри метода (эффективно-финальные),


    static поля и класса, переменные интерфейса (с которым лямбда работает)?

    85) [ссылка на метод - ну и в каком виде передается:

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

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

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

    86) как получить стрим - через разные метод бесконечные стримы ( через [iterate и [generate)

    87) [ВИД Стрим Какие бывают стримы: знать 3 группы:

    1) конечные (терминальные) и бесконечные (промежуточные)

    2) последовательные и параллельные

    3) объектные и примитивные

    спрашивает про параллельные, промежуточные и терминальные (конечные и бесконечные это)

    88) Знать 5 примеров промежуточных операций (intermediate методы) и знать 5 примеров терминальных операций

    89) Расспрашивает про терминальные и промежуточные: кто такие, сколько раз нужно вызывать, где вызывать, терминальные нужны (начало-конец?)

    90) что возвращают промежуточные операции: stream

    91) для чего нужны методы forEach() и forEachOrdered()

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

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

    forEach() или

    forEachOrdered() . Они оба принимают Consumer и прекращает поток, не возвращая ничего. Разница между этими операциями просто в том, что

    forEachOrdered() обещает вызвать предоставленного forEachOrdered() в порядке появления элементов в потоке, тогда как

    forEach() только обещает вызвать Потребителя, но в любом порядке. Последний вариант полезен для параллельных потоков.
    В простом случае, приведенном ниже, мы распечатываем каждый элемент потока в одну строку.
    Stream.of(

    "Monkey", "Lion", "Giraffe", "Lemur", “Lion”

    )

    .forEachOrdered(System.out::print);

    Это даст следующий результат:
    MonkeyLionGiraffeLemurLion



    92) В чем разница между интерфейсами Comparable и Comparator?

    93) еще методы peek и forEach - в чем разница: первый промежуточный, второй - терминальный, ну и функционал какой у каждого

    94) функциональное программирование- плюсы минусы, где применяется

    95) анонимные классы, как создать, где применяются, особенно как создать экземпляр.
    это локальный класс без имени. Используется тогда, когда нужно переопределить метод класса или интерфейса.

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

    [Анонимные классы позволяют сделать наш код более кратким. Анонимные классы позволяют одновременно объявить класс и создать его экземпляр.

    Анонимные классы, в отличие от локальных, не имеют имени.

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

    Синтаксис анонимных классов похож на вызов конструктора класса, за исключением того, что происходит определение класса.

    Анонимный класс — это полноценный внутренний класс. Поэтому у него есть доступ к переменным внешнего класса, в том числе к статическим и приватным:

    И еще одно важное ограничение, которое досталось анонимным классам от их «предков» — внутренних классов: анонимный класс не может содержать статические переменные и методы.

    Добустим у нас есть интерфейс с тремя методами

    Что бы их реализовать мы можем создать полноценные классы это долго и многословно. Есть вариант создать анонимные безимянные классы.

    Например создаем типо объект интерфейса(но не объект, объект интерфейса создавать нельзя)

    Пример MyInterfes testInterfeys = new MyInterfes(){

    @overaid

    };
    96) [Objects

    Классы потоков объектов - это ObjectInputStream и ObjectOutputStream . Эти классы реализуют ObjectInput и ObjectOutput , которые являются подинтерфейсами DataInput и DataOutput . Это означает, что все примитивные методы ввода/вывода данных, рассмотренные в потоках данных, также реализованы в объектных потоках.

    Класс [DataOutputStream представляет поток вывода и предназначен для записи данных примитивных типов, таких, как int, double и т.д. Для записи каждого из примитивных типов предназначен свой метод:
    97) Все способы реализации функицональных интерфейсов

    4 штуки

    1) Имплемитирование в клас

    2) вызов метода

    3) лямбда выражение

    4) вызов через конструктор

    99) [Инстанцировать

    Это создание экземпляра класса название_класса::new для конструктора.

    100) Эффективно финальными – переменные, которые не изменяются в коде, с ними нет никаких операций
    1   2   3   4


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