Рубрики
Без рубрики

Лямбда-выражение – Часть II (Когда и как использовать)

Часть 02 03 документации Oracle на Лямбда-Выражение 🙂 Проблема с анонимных классов… С пометкой todayilearned, java, бразильские разработчики, учебное пособие.

Часть 02 03 документации Oracle на Лямбда-Выражение:)

Проблема с анонимных классов в том, что, если ее реализация слишком простой (интерфейс, который содержит только один метод, например), их синтаксис может показаться неопределенным и не очень ясно.

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

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

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

Лямбда-выражение позволит вам сделать то же самое, но более conscisa еще.

В случае Использования Идеально подходит для Лямбда-Выражения

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

Каждый человек в этой социальной сети она представлена классом Человеку:

public class Pessoa {
    public enum GENERO{
        MASCULINO, FEMININO
    }
    String nome;
    LocalDate nascimento;
    GENERO genero;
    String email;
    public int getIdade(){//...}    
    public void printPessoa(){//...}

}

Предположим, что члены этой социальной сети, которые хранятся в List

Шаг 01: Создание методов, которые находились члены, которые отвечают определенной характеристикой

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

Пример:

public static void printPessoasMaioresQue(List relacao, int idade){
    for(Pessoa p : relacao){
        if(p.getIdade() >= age){
            p.printPessoa();
        }
    }
}

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

Еще один момент, предположим, что вы обновили приложение и изменила структуру класса, Человек, который проводит содержать более переменных, возможно, это воздействие на все эй мест, в которых вы instanciou класс таким образом, что алгоритм, который использует эту информацию, теперь будет по-другому.

И, наконец, это метод строгий, и, если необходимо показать на экране, пользователи больше?

Шаг 02: Создать методы поиска более широко

Ниже метод является более широко распространенным, чем предыдущий:

public static void printPessoasComIdadeEntre(List relacao, int menor, int maior){
    for(Pessoa p : relacao){
        if(menor <= p.getIdade() && p.getIdade() >= maior){
            p.printPessoa();
        }
    }
}

Но что, если вы хотите, чтобы показать на экране членов определенного жанра или сочетание возраста и пола?

Или если вы хотите включить такие атрибуты, как статус отношения или расположение?

Несмотря на то, что метод выше, чтобы быть более общим, чем ранее, придется создать метод для каждой возможности системы по-прежнему делает код хрупким.

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

Шаг 03: Указать код критерию поиска на локальный класс

Метод показывает, на экране члены, которые отвечают на некоторые критерии поиска, которые вы укажите:

public static void printPessoas(List relacao, VerificaPessoa criterio){
    for(Pessoa p: relacao){
        if(criterio.buscaPessoa(p)){
            p.printPessoa();
        }
    }
}

Этот метод проверяет каждый Человек, который указан в Список отношениях, если человек не отвечать усмотрению и в прошлом отписываться.buscaPessoa(p) то метод показывает, на экране человека.

Чтобы указать критерий поиска, вы реализует интерфейс обратного вызова VerificaPessoa

interface VerificaPessoa{
    boolean buscaPessoa(Pessoa p);
}

Класс, что сделает использование этого метода, делает реализацию интерфейса, например:

class VerificaPessoaElegivelParaExercito implements VerificaPessoa{
    public boolean buscaPessoa(Pessoa p){
        return p.genero == Pessoa.Genero.MASCULINO && p.getIdade() >= 18 && p.get() <= 25;
    }
}

Чтобы использовать этот класс, вы создаете экземпляр и вызывает printPessoa:

printPessoa(relacao, new VerificaPessoaElegivelParaExercito())

Несмотря на то, что в этой структуре, менее ломкими, не нужно переписывать методы, если вы измените класс Человек, у вас еще есть дополнительный код: новый интерфейс и класс, место, чтобы каждый поиск, который вы собираетесь сделать в приложении.

Шаг 04: Указать критерий поиска в анонимный класс

printPessoa(relacao, new VerificaPessoa(){
    public boolean buscaPessoa(Pessoa p){
        return p.genero == Pessoa.Genero.MASCULINO && p.getIdade() >= 18 && p.get() <= 25;
    }
})

Этот способ уменьшает количество строк кода, proque вам не нужно создавать новый класс для каждого поиска, который вам нужно выполнить.

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

Шаг 05: Указать критерий поиска в лямбда-выражениях

Интерфейс VerificaPessoa-это функциональный интерфейс. Функциональный класс-это та, которая содержит только один абстрактный метод.

Именно она функциональный класс, который содержит один абстрактный метод, вы можете опустить имя метода, когда вы реализует. Делая это, вы будете реализация лямбда-выражение в inveś анонимного класса.

printPessoa(relacao,(Pessoa p)-> p.genero == Pessoa.Genero.MASCULINO && p.getIdade() >= 18 && p.get() <= 25);

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

interface Predicate{
    boolean buscaPessoa(Pessoa p);  
}

public static void printPessoaComPredicate(List relacao, Predicate criterio){
    for(Pessoa p : relacao){
        if(criterio.buscaPessoa(p){
            p.printPessoa();
        }
    }
}

printPessoaComPredicate(relacao, p -> p.getGenero == Pessoa.Genero.MASCULINO && p.getIdade() >= 18 && p.getIdade() <= 25);

Источник: Документации Oracle Сотрудничество: Silvair Soares

Оригинал: “https://dev.to/diariodeumacdf/expressao-lambda-parte-ii-quando-e-como-usar-efm”