본문 바로가기

강의/TDD, Clean Code with Java 12기

람다 실습 2 - 람다를 활용해 중복 제거

람다 실습 2 - 람다를 활용해 중복 제거

3개의 비슷한 기능을 가진 메서드가 존재한다.

sumAll, sumAllEven, sumAllOverThree method 소스 코드를 확인하고 중복 제거한다.

람다를 사용하여 중복된 부분을 제거하여 보자.

public static int sumAll(List<Integer> numbers) {
    int total = 0;
    for (int number : numbers) {
        total += number;
    }
    return total;
}

public static int sumAllEven(List<Integer> numbers) {
    int total = 0;
    for (int number : numbers) {
        if (number % 2 == 0) {
            total += number;
        }
    }
    return total;
}

public static int sumAllOverThree(List<Integer> numbers) {
    int total = 0;
    for (int number : numbers) {
        if (number > 3) {
            total += number;
        }
    }
    return total;
}

위 코드를 비슷한 포맷으로 변경해준다. (sumAll 클래스에서 if 문 추가)

public static int sumAll(List<Integer> numbers) {
    int total = 0;
    for (int number : numbers) {
    	if (true) {
            total += number;
        }
    }
    return total;
}

public static int sumAllEven(List<Integer> numbers) {
    int total = 0;
    for (int number : numbers) {
        if (number % 2 == 0) {
            total += number;
        }
    }
    return total;
}

public static int sumAllOverThree(List<Integer> numbers) {
    int total = 0;
    for (int number : numbers) {
        if (number > 3) {
            total += number;
        }
    }
    return total;
}

 

 

  • 변경되는 부분을 인터페이스로 추출한다. (if 문이 계속해서 변경되는 것을 확인할 수 있다.)
  • if 문의 결과는 boolean type 이고 인자로 number를 받으면 된다.
public interface Conditional {
    boolean test(Integer number);
}
  • 인터페이스를 코드에 적용하면 아래와 같은 모습이 될 것이다.
public static int sumAll(List<Integer> numbers, Conditional conditional) {
    int total = 0;
    for (Integer number: numbers) {
        if (conditional.test(number)) {
            total += number;
        }
    }
    return total;
}

public static int sumAllEven(List<Integer> numbers, Conditional conditional) {
    int total = 0;
    for (int number : numbers) {
        if (conditional.test(number)) {
            total += number;
        }
    }
    return total;
}

public static int sumAllOverThree(List<Integer> numbers, Conditional conditional) {
    int total = 0;
    for (int number : numbers) {
        if (conditional.test(number)) {
            total += number;
        }
    }
    return total;
}
  • 3개의 코드가 완전히 동일한 코드가 되었기 때문에, 메서드 명을 변경하고 하나로 만들어 준다.
public static int sumAllByCondition(List<Integer> numbers, Conditional conditional) {
int total = 0;
for (int number: numbers) {
    if (conditional.test(number)) {
        total+= number;
    }
}
return total;

number를 인자로 받는 Conditional 익명클래스를 람다식으로 구현하면 아래와 같다.

public static int sumAll(List<Integer> numbers) {
    return Calculator.sumAllByCondition(numbers, (number -> true));
}

public static int sumAllEven(List<Integer> numbers) {
    return Calculator.sumAllByCondition(numbers, number -> number % 2 == 0);
}


public static int sumAllOverThree(List<Integer> numbers) {
    return Calculator.sumAllByCondition(numbers, (number -> number > 3));
}

 

[참고]

https://nlp.jbnu.ac.kr/PL2020/java_lambda_expression.pdf

'강의 > TDD, Clean Code with Java 12기' 카테고리의 다른 글

스트림 실습  (0) 2021.08.25
스트림(stream)  (0) 2021.08.25
람다 실습 1 - 익명 클래스를 람다로 전환  (0) 2021.08.25
람다  (0) 2021.08.25
[로또] step4 - 로또(수동) - 29일차  (0) 2021.08.17