21.9.14

10491 단어 TILTIL

Day38

람다

람다(Lambda)란?
1. Java SE 8에서 도입 된 기법
2. 익명함수 = Closure = @FunctionlInterface
3. 코드를 간결화 = 함수형 인터페이스 = 익명클래스
4. 람다식 함수형 인터페이스 : 하나의 인터페이스 구현이 필요한 메소드를 1개만 가지는 원형으로 선언하여 변수처럼 할당시키거나 다른 메소드들에 변수를 이요해 값을 전달하는 형태의 간단한 식
5. 표현식 사용 : (구현하는 메소드의 인수) -> {처리} 형식
6. 표현식 특징

  • 람다 표현식은 익명으로 처리되어 이름이 없다.
  • 람다 표현식은 compiler가 context에 맞는 타입을 유추하기에 return type이 없다.
  • throws가 없다.
  • 표현식 자체가 generic이 될 수 없어 type 파라미터를 선언 할 수 없다.
  1. 사용 예 : (), {}는 생략가능
    // 매개인자로 su를 받아 출력하는 구문
    int su -> System.out.println(su);
    // 자료형이 생략가능
    su -> System.out.println(su);
    // 매개인자가 하나일경우에만 (), {}의 생략이 가능하다.
    // 매개인자가 없는 경우 ()만 사용하여 명령 실행이 가능하다
    () -> System.out.println("ㅇㅋ");
    // 매개인자가 두개 이상이라면 자료형을 생략하여 실행 할 수 있다.
    (a,b) -> {return a + b};
  2. 표준 함수 API -> java.util.function
    43개의 인터페이스가 존재_매개인자,리턴타입을 기준으로 4개의 기본 종류
  • Function R apply(T t)
  • Predicate boolean test(T t)
  • Consumer void accept(T t)
  • Supplier T get()
  1. Function 인터페이스 계열
  • 매개인자가 하나에서 리턴값이 임의의 템플릿을 수행할 때 apply 메소드를 람다로 사용한다.

  • apply() 메소드의 리턴 타입이 R이기 때문에 람다식 중괄호{}의 리턴값이 R의 객체가 되도록 한다.

  • andThen(), compse() 메소드는 Function을 매개 인자로 가지고 Function으로 리턴된다

    @FunctionalInterface
    public interface Function<T, R>{
    	R apply(T t);
    }
    //ex 1 
    Function<Integer, Integer> a1 = e -> e * 2;
     //ex 2 
    Function<Integer, Integer> a2 = e -> e * e;
    a1.compose(a2).apply(2); // 숫자 2를 e로 전달한 후에 a2, a1순으로 수행한다.
    a1.andThen(a2).apply(2); // 숫자 2를 e로 전달한 후에 a1, a2순으로 수행하겠다.
  1. Predicate 인터페이스 계열
    조건 집합을 정의하고 지정된 객체가 조건 충족 유무에 따라 true /false로 리턴하는 메소드를 가진다.

    @FunctidnalInterface
    public interface Predicate<T>{
    	boolean test(T t);
    }
  2. Supplier 인터페이스 계열

  • 어떤 값을 리턴하는 인터페이스로 매개 인자가 없는 함수의 원형이며
    int, long, double, boolean 값을 반환하는 BooleanSupplie도 정의 되어 있다.
  • 추상 메소드 get()이 정의 되어 있다.
  • 각 메소드는 정의된 자료형을 리턴하도록 되어있어 람다의 메소드 참조, 생성자 참조등과 함께 요소를 관리하는 컬렉션의 객체를 사용할 때 적용하면 코드가 간결해진다.
  1. Consumer 인터페이스 계열
  • 컨슈머 인터페이스는 값을 받아 처리하지만 반환값을 리턴하지 않는 인터페이스이다 반환값이 없는 void형 Function과 흡사하다.
  1. UnaryOperator
    @FunctionalInterface
    public interface UnaryOperator<T> extends Function <T,T>{
    	static <T> UnaryOperator <T> identity();
    }
  • 연산자 계열

  • 연산 인수를 그대로 리턴한다.

    @FunctionalInterface
    public interface BinaryOperator<T> extends Function <T,T,T>{
    	static <T> BinaryOperator <T> identity();
    }

람다 활용법

_메소드와 생성자 참조

  • jdk 8부터는 메소드와 생성자를 직접 참조 할 수 있다.
  • C++ :: Scope 연산자를 사용한다.
  • 생성자 참조 : class_name :: new
  • 메소드 참조 : class_name :: method_name = static
  • non-static : instance_name :: method_name

좋은 웹페이지 즐겨찾기