01.기초

동적 파라미터화 코드 전달하기

자주 바뀌는 요구사항에 효과적으로 대응하자.

  • 동적 파라미터 : 아직은 어떻게 실행할지 결정하지 않은 코드 블록

  • 동작(코드)을 메서드 인수로 전달

Before

public static List<Apple> filterGreenApples(List<Apple> inventory) {
    List<Apple> result = new ArrayList<>();
    for (Apple apple : inventory) {
        if ("green".equals(apple.getColor())) {
            result.add(apple);
        }
    }
    return result;
}

After

선택 조건을 결정하는 인터페이스를 정의하자. (전략 디자인 패턴)

  • 각 항목에 적용할 동작을 분리

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

public class weightPredicate implements Predicate {
    @Override
    public boolean test(T t) {
        return t.getWeight() > 150;
    }
}

public class colorPredicate implements Predicate {
    @Override
    public boolean test(T t) {
        return t.getColor() == Color.GREEN;
    }
}

public <T> List<T> filter(List<T> list, Predicate<T> p) {
    List<T> result = new ArrayList<>();
    for (T e : list) {
        if (p.test(e)) {
            result.add(e);
        }
    }
    return result;
}

//
List<Apple> greenApples = filter(inventory, new colorPredicate());

람다 표현식

메서드로 전달할 수 있는 익명 함수를 단순화한 것.

익명 함수의 일종이다 -> 이름은 없지만, 파라미터 리스트, 바디, 반환 형식을 가지고 예외를 던질 수 있다.

  • 람다 표현식의 구성

    • 파라미터 리스트

    • 화살표

    • 람다 바디

함수형 인터페이스

  • 함수형 인터페이스 : 오직 하나의 추상 메서드만을 정의하는 인터페이스

    • 함수형 인터페이스를 기대하는 곳에서만 람다 표현식 사용 가능

  • 제네릭 파라미터에는 참조형(Byte, Integer, Object, List..)만 사용 가능

Predicate

  • 추상 메서드를 정의하여 제네릭 형식 T의 객체를 인수로 받아 Boolean 반환

Consumer

  • 추상 메서드를 정의하여 제네릭 형식 T의 객체를 인수로 받아 void 반환 (특정 동작 수행)

Function

  • 추상 메서드를 정의하여 제네릭 형식 T의 객체를 인수로 받아 제네릭 형식 R 객체를 반환 (입력을 출력으로 매핑할 경우)

람다, 메서드 참조 활용

1단계: 코드 전달

  • 객체 안에 동작을 포함시키는 방식으로 다양한 전략 전달

    • sort 동작은 파라미터화 되었다!

2단계: 익명 클래스 사용

  • 일회성이 있는 경우 익명 클래스를 이용하는 것이 좋다.

3단계: 람다 표현식 사용

  • 함수형 인터페이스를 기대하는 곳 어디서나 람다 표현식을 사용할 수 있다.

4단계: 메서드 참조 사용

  • 메서드 참조를 이용하면 람다 표현식의 인수를 더 깔끔하게 전달할 수 있다.

람다 표현식 조합 유용 메서드

Comparator

  • 정적 메서드 Comparator.comparing를 이용해서 비교에 사용할 키 추출

Predicate

  • 복잡한 Predicate를만들 수 있도록 negate, and, or 세 가지 메서드 제공

Function

  • Function 인스턴스를 반환하는 andThen, compose 두 가지 default 메서드 제공

Last updated