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

  • Лямбда

  • Ревью 7. Ревью 7 - Функциональные Интерфейсы, Streams. Чем является Stream в контексте Java 3 Для чего нужен 3


    Скачать 84.11 Kb.
    НазваниеЧем является Stream в контексте Java 3 Для чего нужен 3
    АнкорРевью 7
    Дата19.01.2023
    Размер84.11 Kb.
    Формат файлаdocx
    Имя файлаРевью 7 - Функциональные Интерфейсы, Streams.docx
    ТипДокументы
    #894719
    страница5 из 9
    1   2   3   4   5   6   7   8   9

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


    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. Терминальная операция.

    Лямбда:

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


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

    Основу лямбда-выражения составляет лямбда-оператор, который представляет стрелку ->. Этот оператор разделяет лямбда-выражение на две части: левая часть содержит список параметров выражения, а правая, собственно, представляет тело лямбда-выражения, где выполняются все действия.

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

    interface Operationable {

    int calculate(int x, int y);

    }

    public static void main(String[] args) {

    Operationable operation = (x, y) -> x + y;

    int result = operation.calculate(10, 20);

    System.out.println(result); //30

    }

    По факту лямбда-выражения являются в некотором роде сокращенной формой внутренних анонимных классов, которые ранее применялись в Java.

    Отложенное выполнение (deferred execution) лямбда-выражения- определяется один раз в одном месте программы, вызываются при необходимости, любое количество раз и в произвольном месте программы.

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

    operation = (int x, int y) -> x + y;

    //При написании самого лямбда-выражения тип параметров разрешается не указывать:

    (x, y) -> x + y;

    //Если метод не принимает никаких параметров, то пишутся пустые скобки, например,

    () -> 30 + 20;

    //Если метод принимает только один параметр, то скобки можно опустить:

    n -> n * n;

    Конечные лямбда-выражения не обязаны возвращать какое-либо значение.

    interface Printable {

    void print(String s);

    }

    public static void main(String[] args) {

    Printable printer = s -> System.out.println(s);

    printer.print("Hello, world");

    }

    Блочные лямбда-выражения обрамляются фигурными скобками. В блочных лямбда-выражениях можно использовать внутренние вложенные блоки, циклы, конструкции if, switch, создавать переменные и т.д. Если блочное лямбда-выражение должно возвращать значение, то явным образом применяется оператор return:

    Operationable operation = (int x, int y) -> {

    if (y == 0) {

    return 0;

    }

    else {

    return x / y;

    }

    };

    Передача лямбда-выражения в качестве параметра метода:

    interface Condition {

    boolean isAppropriate(int n);

    }

    private static int sum(int[] numbers, Condition condition) {

    int result = 0;

    for (int i : numbers) {

    if (condition.isAppropriate(i)) {

    result += i;

    }

    }

    return result;

    }

    public static void main(String[] args) {

    System.out.println(sum(new int[] {0, 1, 0, 3, 0, 5, 0, 7, 0, 9}, (n) -> n != 0));

    }
    1   2   3   4   5   6   7   8   9


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