Effective Java Item 42

한주영·2024년 2월 29일
0

이펙티브자바

목록 보기
29/33

익명 클래스보다는 람다를 사용하라

함수 객체(function object)

->자바에서 함수타입을 표현할때 추상 메서드를 담은 인터페이스의 인스턴스

익명클래스의 인스턴스를 함수객체로 사용하는것은 낡은 기법
코드가 너무길기때문에 적합하지않음
함수형 인터페이스라 불리는 인터페이스-> 람다식을 사용해 만들수있게됨

람다식을 함수 객체로 사용한 예시 코드

Collections.sort(words,
           (s1,s2) -> Integer.compare(s1.length(), s2.length())));

타입추론규칙
자바언어 명세의 장 하나를 통째로 차지할만큼 복잡함.
-> 타입을 명시해야 코드가 더 명확할때를 제외하고 람다의 모든 매개변수는 생략하자

람다를 사용함으로써
언어차원에서 지원하면서 기존에는 적합하지 않았던곳에서도
함수객체를 실용적으로 사용할수있게됨

아이템34의 상수별 클래스 몸체와 데이터를 사용한 열거타입
=> 함수객체를 인스턴스 필드에 저장해 상수별 동작을 구현한 열거타입 예시코드

import java.util.function.DoubleBinaryOperator;

public enum Opreation {

    PLUS("+",(x,y)->x+y),

    MINUS("-",(x,y)->x-y),
    TIMES("*",(x,y)->x*y),
    DIVIDE("/",(x,y) -> x/y);

    private final String symbol;

    private final DoubleBinaryOperator op;


    Opreation(String symbol, DoubleBinaryOperator op) {
        this.symbol = symbol;
        this.op = op;
    }

    @Override
    public String toString() {
        return  symbol;
    }

    public  double apply(double x, double y){

        return op.applyAsDouble(x,y);
    }
}

->열거타입 상수 동작을 표현한 람다를 DoubleBinaryOperator변수에 할당

메서드나 클래스와 달리 람다는 이름이없고 문서화를 못한다
코드 자체로 동작이 명확히 설명되지 않거나 코드 줄 수가 많아지면 람다를 쓰지 말아야 한다.

람다는 한줄일때 가장 좋고 길어야 세줄 안에 끝내는게 좋음

람다는 함수형 인터페이스에서만 쓰임
추상클래스의 인스턴스를 만들때 람다를 쓸수없으니 익명클래스를 사용해야함

람다는 자신을 참조할수없다
->this 키워드는 바깥 인스턴스를 가리킨다.
->반면 익명클래스에서의 this는 익명클래스의 인스턴스 자신을 가리킨다.
-> 람다도 익명클래스처럼 직렬화 형태가 구현별로 다를수 있기 때문에 람다를 직렬화 하는것은 극히 삼가야한다

profile
백엔드개발자가 되고싶은 코린이:)

0개의 댓글