티스토리 뷰

Java

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

snail voyager 2023. 6. 21. 00:24
728x90
반응형

동작 파라미터화

메서드가 다양한 동작(전략)을 받아서 내부적으로 다양한 동작을 수행할 수 있다.

코드/동작(전략)을 메서드 인수로 전달, 한 개의 파라미터로 다양한 동작

변화하는 요구사항에 더 잘 대응할 수 있는 코드를 구현

//As-Is
  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;
    }
//Step1
    public static List<Apple> filterGreenApplesByColor(List<Apple> inventory, Color color) {    //색을 파라미터화
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (color.equals(apple.getColor())) {
                result.add(apple);
            }
        }
        return result;
    }

    public static List<Apple> filterGreenApplesByWeight(List<Apple> inventory, int weight) {    //무게로 필터링
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (apple.getWeight() > weight) {   //필터링 부분만 제외하고 중복되는 코드
                result.add(apple);
            }
        }
        return result;
    }
//Step2
    public static List<Apple> filterGreenApples(List<Apple> inventory, Color color, int weight) {    //모든 속성을 파라미터 추가
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (apple.getWeight() > weight
                    && color.equals(apple.getColor())) {
                result.add(apple);
            }
        }
        return result;
    }
//To-Be
    public static <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> redApples = filter(inventory, (Apple apple) -> RED.equals(apple.getColor()));   //메서드에 코드/동작 전달하기
    List<Integer> evenNumbers = filter(numbers, (Integer i) -> i % 2 == 0);

동작 파라미터화 사용 사례

  • Comparator로 정렬하기
  • Runnable로 코드 블록 실행하기
  • Callable을 결과로 반환하기

 

728x90
반응형

'Java' 카테고리의 다른 글

[Java] 스트림으로 데이터 수집 - 요약 연산  (0) 2023.08.05
[Java] Stream  (0) 2023.07.31
Optional  (0) 2022.09.18
[Java] Json 변환 Jackson ObjectMapper  (0) 2022.08.01
Primitive vs Wrapper Class  (0) 2022.03.20
반응형
300x250