해결된 질문
작성
·
85
·
수정됨
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 정보]
질문 내용의 위치:3. 함수형 인터페이스.pdf _ 문제와 풀이 _ 문제1 - FilterExampleEx2
제가 작성한 소스코드: https://inf.run/GQrVP
질문 요약:
1) Predicate
말고도 추가적으로 filter()
메서드도 BiFunction
함수형 인터페이스로 대체했는데, 이 정도까지 (메서드까지) 대체하는 것은 너무 과한 행동인지 궁금합니다.
2) BiFunction.apply()
를 호출하여 필터링 하는 방식은 filter()
메서드로 필터링하는 방식보다 직관성이 떨어지기 때문에 권장되지 않는지 또는 그냥 사용해도 되는지 궁금합니다.
[질문 내용]
안녕하세요. 기존 FilterExampleEx2
의 모든 부분을 자바가 제공하는 함수형 인터페이스로 대체하는 문제로 잘못 이해해서 filter(리스트, Predicate)
메서드까지 BiFunction<리스트, Predicate, 리스트>
함수형 인터페이스로 대체를 했습니다. 이때 제가 생각했을 때는 크게 두 가지 부분이 문제가 될 수도 있겠다고 생각을 했는데, 실제로도 문제가 될 위험이 있는지 궁금해서 질문드립니다. (필터링 결과는 동일합니다.)
(제가 추측한) 문제 상황1. 너무 과한 대체
메서드까지 함수형 인터페이스로 대체하는 것은 너무 과하다.
(제가 추측한) 문제 상황2. 직관성의 저하
(영한님 답안의 경우) filter()
메서드를 호출하는 방식의 경우 메서드명이 filter
로 직관적이다.
(제 답안의 경우) BiFunction.apply()
를 호출하는 방식의 경우 apply()
라는 메서드명만 보고는 "필터링한다"라는 느낌을 받을 수 없어 직관적이지 못하다.
제가 작성한 소스코드는 [질문 정보] 부분에 구글 드라이브 링크를 첨부했으나, 혹시 몰라 질문글에도 작성해봅니다.
package lambda.ex3;
import java.util.ArrayList;
import java.util.function.BiFunction;
import java.util.function.Predicate;
import java.util.List;
// 내 풀이
public class FilterExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(-3, -2, -1, 1, 2, 3, 5);
System.out.println("원본 리스트: " + numbers);
// predicate까지 parameter로 받으면 더 유연하다.
BiFunction<List<Integer>, Predicate<Integer>, List<Integer>> listFilter =
(numberList, predicate) -> {
ArrayList<Integer> filteredList = new ArrayList<>();
for (Integer number : numberList) {
if (predicate.test(number)) filteredList.add(number);
}
return filteredList;
};
// 조건 1. 음수(negative)만 골라내기
Predicate<Integer> isNegative = n -> n < 0;
List<Integer> negatives = listFilter.apply(numbers, isNegative);
System.out.println("음수만: " + negatives);
// 조건 2. 짝수(even)만 골라내기
Predicate<Integer> isEven = n -> n % 2 == 0;
List<Integer> evens = listFilter.apply(numbers, isEven);
System.out.println("짝수만: " + evens);
}
}
답변 2
1
안녕하세요. dev.rudevico님
이 문제에서 메서드까지 BiFunction으로 대체하는 것은 조금 과한 것 같아요. 가독성 측면에서도 읽기가 더 어렵구요.
하지만 메서드가 아닌 더 유연하게 람다 함수를 반환하는 것이 필요한 경우라면 의미가 있다 생각합니다.
감사합니다.
1
무슨 말씀이신지 이해했습니다. 소중한 답변 감사합니다!