람다 및 함수형 프로그래밍 - Java 11

람다와 기능적 인터페이스



간단한 람다 작성


  • 함수형 프로그래밍은 보다 선언적으로 코드를 작성하는 방법입니다. 개체의 상태를 처리하는 대신 수행하려는 작업을 지정합니다. 루프보다 표현식에 더 중점을 둡니다.
  • 함수형 프로그래밍은 람다 식을 사용하여 코드를 작성합니다.
  • 람다 식은 이름이 지정되지 않은 메서드입니다.

  • 람다 예제




    public class Animal {
    
       private String especie;
       private boolean podeSaltar;
       private boolean podeNadar;
    
       public Animal(String nomeDaEspecie, boolean saltador, boolean nadador){
          especie = nomeDaEspecie;
          podeSaltar = saltador;
          podeNadar = nadador;
       }
    
       public boolean podeSaltar() { return podeSaltar; }
       public boolean podeNadar() { return podeNadar; }
       public String toString() { return especie; }
    }
    



    public interface AnalisadorDeAnimal {
       boolean teste(Animal a);
    }
    



    import java.util.ArrayList;
    import java.util.List;
    
    public class TraditionalSearch {
        public static void main(String[] args) {
    
            // lista de animais
            List<Animal> animais = new ArrayList<Animal>();
            animais.add(new Animal("peixe", false, true));
            animais.add(new Animal("canguru", true, false));
            animais.add(new Animal("coelho", true, false));
            animais.add(new Animal("tartaruga", false, true));
    
            // imprime os animais verificados
            imprimir(animais, new VerificaSeSaltador());
        }
        private static void imprimir(List<Animal> animais, Verificador verificador) {
            for (Animal animal : animais) {
                // verificando
                if (verificador.verificar(animal)) {
                    System.out.print(animal + " ");
                }
            }
            System.out.println();
        }
    }
    



    canguru coelho
    


  • 동물이 스윙할 수 있는지 확인하려면 어떻게 해야 합니까?
  • 대안: 람다

  • // imprime os animais que podem saltar  
    imprimir(animais, animal -> animal.podeSaltar());
    


    또는

    // imprime os animais que podem nadar  
    imprimir(animais, animal -> animal.podeNadar());
    


    람다 구문


  • Lambda는 하나의 추상 메서드만 있는 인터페이스에서 작동합니다.

  •     animal -> animal.podeSaltar()
    


  • 구문:
  • 단일 매개변수(동물)
  • 매개변수와 본문을 구분하는 화살표;
  • 단일 메서드를 호출하고 해당 메서드의 결과를 반환하는 본문


  • (Animal animal) -> {return a.podeSaltar();}
    


  • 구문
  • animal이라는 이름으로 지정되고 유형이 Animal임을 나타내는 단일 매개변수
  • 매개변수와 본문을 구분하는 화살표 연산자
  • 세미콜론 및 return 문을 포함하여 하나 이상의 코드 행이 있는 본문

  • 단일 매개변수가 있는 경우에만 괄호를 생략할 수 있습니다.
  • 유형이 명시적으로 지정되지 않았습니다.
  • 단일 문만 있는 경우 중괄호를 생략할 수 있습니다.
  • 중괄호를 사용하지 않으면 Java에서 return을 입력하거나 세미콜론을 사용할 필요가 없습니다.


  • 기능적 인터페이스 소개



  • 기능적 인터페이스는 하나의 추상 메서드만 있는 인터페이스입니다.
  • Predicate, Consumer, Supplier 및 Comparator와 같은 기본 제공 기능 인터페이스를 알고 있어야 합니다.

  • 술부




    public interface Predicate<T> {
       boolean test(T t);
    }
    



    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.Predicate;
    
    public class UsoDoPredicate {
    
        public static void main(String[] args) {
            List<Animal> animais = new ArrayList<>();
            animais.add(new Animal("peixe", false, true));
            animais.add(new Animal("canguru", true, false));
    
            print(animais, a -> a.podeSaltar());
        }
        private static void print(List<Animal> animais, Predicate<Animal> verificador) {
            for (Animal animal : animais) {
                if (verificador.test(animal))
                    System.out.print(animal + " ");
            }
            System.out.println();
        }
    }
    



    canguru
    


    소비자




    public interface Consumer<T> {
        void accept(T t)
    }
    



    import java.util.function.Consumer;
    
    public class UsoDoConsumer {
    
        public static void main(String[] args) {
            Consumer<String> consumer = x -> System.out.println(x);
            print(consumer, "Hello World");
        }
        private static void print(Consumer<String> consumer, String value) {
            consumer.accept(value);
        }
    }
    



    Hello World
    


    공급자




    public interface Supplier<T> {  
         T get();  
    }
    



    import java.util.function.Supplier;
    
    public class UsoDoSupplier {
    
        public static void main(String[] args) {
            Supplier<Integer> number = () ->  42;
            System.out.println(returnNumber(number));
        }
    
        private static int returnNumber(Supplier<Integer> supplier) {
            return supplier.get();
        }
    }
    



    42
    


    비교기


  • 규칙, 반환되는 경우:
  • 음수는 첫 번째 값이 더 작음을 의미합니다.
  • 0은 둘이 같음을 의미합니다.
  • 및 양수는 첫 번째 값이 더 크다는 것을 의미합니다.


  • import java.util.Arrays;
    import java.util.Comparator;
    
    public class UsoDoComparator {
    
        public static void main(String[] args) {
            Integer [] array = {4, 1, 7, 2, 5};
            print(array, (i1, i2) -> i1 - i2);
        }
    
        public static void print(Integer [] array, Comparator<Integer> comparator) {
            Arrays.sort(array, comparator);
            System.out.println(Arrays.toString(array));
        }
    }
    



    [1, 2, 4, 5, 7]
    


    Lambda에서 변수 작업


  • 장소가 나타날 수 있습니다.
  • 매개변수 목록;
  • 람다 본문 내부에 선언된 지역 변수;
  • 람다 본문에서 참조하는 변수;

  • 메서드 매개 변수 및 로컬 변수는 사실상 최종 변수인 경우 참조할 수 있습니다(변수 값은 설정된 후에 변경되지 않음).

  • Lambda로 API 호출




    import java.util.ArrayList;
    import java.util.List;
    
    public class ExemploUsandoLambdasEmAPI {
    
        public static void main(String[] args) {
            List<String> names = new ArrayList<>();
            names.add("Joao");
            names.add("Jose");
            names.add("Maria");
            System.out.println("Nomes: " + names);
    
            names.removeIf(name -> !name.startsWith("J"));
            System.out.println("Nomes iniciando com J: " + names);
    
            names.add("Araci");
            names.add("Ze");
            System.out.println("\nNomes: " + names);
    
            names.sort((name1, name2) -> name1.compareTo(name2));
            System.out.println("Nomes ordenados: " + names);
    
            System.out.println("\nImprimindo novamente");
            names.forEach(name -> System.out.println(name));
    
        }
    }
    



    Nomes: [Joao, Jose, Maria]
    Nomes iniciando com J: [Joao, Jose]
    
    Nomes: [Joao, Jose, Araci, Ze]
    Nomes ordenados: [Araci, Joao, Jose, Ze]
    
    Imprimindo novamente
    Araci
    Joao
    Jose
    Ze
    


    REMOVEIF()


  • 은 Predicate를 사용하여 목록에서 제거할 항목을 결정합니다.

  • 종류()


  • sort() 메소드는 정렬 순서를 제공하는 Comparator를 사용합니다.

  • 각각()


  • 소비자를 가져와 발생한 각 요소에 대해 해당 람다를 호출합니다.
  • 좋은 웹페이지 즐겨찾기