티스토리 뷰
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