람다 실습 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));
}
[참고]
'강의 > 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 |