인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

dev.rudevico님의 프로필 이미지

작성한 질문수

김영한의 실전 자바 - 고급 3편, 람다, 스트림, 함수형 프로그래밍

문제와 풀이

FilterExampleEx2의 또 다른 답안 질문

해결된 질문

작성

·

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으로 대체하는 것은 조금 과한 것 같아요. 가독성 측면에서도 읽기가 더 어렵구요.

하지만 메서드가 아닌 더 유연하게 람다 함수를 반환하는 것이 필요한 경우라면 의미가 있다 생각합니다.

감사합니다.

dev.rudevico님의 프로필 이미지
dev.rudevico
질문자

무슨 말씀이신지 이해했습니다. 소중한 답변 감사합니다!

1

ppj2130님의 프로필 이미지

너무 과하게 인자를 받으시는거아닐까요,, 굳이굳이 싶은데여 여기서는

 

Predicate 가 여기서는 Integer 역할만하면되는데 굳이굳이 싶습니다.

dev.rudevico님의 프로필 이미지
dev.rudevico
질문자

그쵸..? 만들고 나서 좀 과하다는 느낌을 받았는데, 다른 분들 생각도 비슷한가 보군요. 소중한 의견 감사합니다!