You will be fine

<Lambda> 3. JAVA8 in Action - Chapter 3

by BFine
반응형

JAVA8 in Action - part 1

Chapter 3 - 람다 표현식

3.1.1 람다란?

  • 익명클래스처럼 이름없는 함수이면서 메서드를 인수로 전달할 수 있다.
  • 람다표현식은 메서드로 전달할 수 있는 익명함수를 단순화 한 것이라 할 수 있다.
  • 람다의 특징
    • 익명, 간결
    • 함수 : 람다는 메서드처럼 특정클래스에 종속 되지 않는다.(예외리스트 가능)
    • 전달 : 람다표현식을 인수로 전달하거나 변수로 저장할 수 있다.
  • 람다의 구성
    • 파라미터, 화살표(->), 바디

3.2.1 함수형 인터페이스

  • 위의 Predicate가 함수형 인터페이스라 할 수 있다.
  • 함수형 인터페이스는 하나의 추상메서드 를 지정하는 인터페이스이다. (ex. Runnable, Comparator)
  • 디폴트 메서드를 많이 가지고 있어도 추상메서드가 하나라면 함수형 인터페이스이다.

3.2.2 함수 디스크립터

  • 람다 표현식의 시그니처를 서술하는 메서드를 함수디스크립터 라고 부른다.
    • 시그니처는 파라미터, 반환값을 통칭한다.

3.3.1 람다 활용

  • 설정 - 처리 - 정리로 처리과정이 이처럼 두과정의 형태를 갖는 형식이 실행 어라운드 패턴 이다.
  • 함수형 인터페이스를 선언하고 원하는 메서드에 파라미터로 구현을 하면 간결한 코드를 작성할 수 있다.

3.4.1 함수형 인터페이스 사용

  • java.util.function 패키지에 여러가지 새로운 함수형 인터페이스를 추가했다.

    • Predicate : T 객체를 받아 boolean으로 처리한다.
    • Consumer : T 객체를 받아 void로 처리한다.
    • Function : T 객체를 받아 R로 처리한다.
  • 기본형을 참조형으로 변환하는 것을 박싱, 반대의 경우는 언박싱이라고 한다.

  • 박싱값은 기본형을 감싸는 Wrapper이게 되고 힙에 저장된다.

    박싱한 값은 메모리를 더 소비하고 기본형을 가져올때도 메모리를 탐색하는 과정이 필요하다.

  • JAVA8에서는 이런 오토박싱 문제를 해결하기 위한 기본형 인터페이스를 제공한다.

  • 예외는 명시적으로 try-catch를 사용할 수 있다.

3.5.1 형식 검사

  • 람다표현식 자체는 어떤 함수형 인터페이스를 구현하느지 정보가 포함되어 있지 않다.
  • context를 이용해서 람다의 type을 추론할 수 있다.
  • 람다의 표현형식을 target type이라고 부른다.

3.5.2 같은 람다 , 다른 함수형 인터페이스

  • 같은 람다 표현식이더라도 호환되는 추상메서드를 가진 다른 함수형 인터페이스로 사용될 수 있다.

3.5.3 Type 추론

  • 컴파일러는 함수 디스크립터를 통해서 람다의 시그니처를 추론할 수 있다.
  • 파라미터 형식을 배제하거나 하지 않거나는 개발자 스스로에게 달려있다.

3.5.4 지역변수 사용

  • 람다 표현식 안에서도 지역변수를 사용 할 수 있다. 이를 람다 캡처링 이라고 한다.
  • 지역 변수의 조건은 한 번만 할당 할 수 있어야 한다. (final)
  • 인스턴스 변수는 힙에 저장되고 지역변수는 스택에 위치한다
  • 람다를 실행하는 스레드에서는 지역변수에 직접 접근하는 것이 아닌 복사본 을 제공받는다.
  • 람다는 변수가 아닌 값에 국한되어 동작을 수행한다.
  • 클로저 란 함수의 비지역 변수를 자유롭게 참조할 수 있는 함수의 인스턴스를 가르킨다.
  • 클로저는 클로저 외부에 정의된 변수값에 접근하고 값을 바꿀 수 있다.

3.6.1 메서드 레퍼런스

  • 메서드 레버런스를 이용하면 기존 메서드 정의를 재활용해서 람다처럼 전달할 수 있다. (System.out::print)
  • 메서드 레퍼런스는 특정 메서드만을 호출하는 람다의 축약형 이라고 할 수 있다.
  • 명시적으로 메서드명을 참조해서 가독성 을 높일 수 있다.
  • 객체 자체를 레퍼런스 할수도 있다. (student::getName)
  • 생성자 레퍼런스는 new 키워드를 이용한다.(Student::new)

3.8.1 Comparator의 메서드

  • Comparator.comparing(Student::getAge) 이용해 비교값을 추출할 수 있다.
  • Comparator.comparing().reversed로 역정렬 할 수 있다.
  • Comparator.thenComparing으로 두번째비교 연산자를 만들 수 있다.
      list.stream().sort(Comparator.comparing(Student::getAge))
          .thenComparing(Student::getName)
      나이순으로 정렬하되 나이가 같으면 이름순으로 정렬

3.8.2 Predicate의 메서드

  • negate(반전), and(&&), or(||) 세가지 메서드를 제공한다.
      Predicate<Student> thirdAndMiddle =
          third.and(s->s.getSchool.equals("Middle"));
      3학년이면서 중학교 다니는 학생    

3.8.3 Function의 메서드

  • andThen, compose 두가지 메서드를 제공한다.
  • andThen는 먼저 실행된 람다식의 결과를 가지고 람다식을 수행한다.(g(f(x)))
  • compose는 나중에 정의된 람다식의 결과를 먼저 정의된 람다식의 인수로 사용한다.(f(g(x)))

출처

  • Java8 in Action


반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기