계산기 과제 : 계산 결과 Lambda&Stream 필터링 조회 구현하기

2025. 1. 7. 17:56·공부하기/Java

Lv.3 의 구현사항

  1. 계산기 클래스의 메서드 calculate의 피연산자로 모든 타입의 숫자를 받아올 수 있어야 한다. (int, double, 양수, 음수)
  2. enum 으로 연산자 타입을 관리하고 활용한다.
  3. 계산기에 저장된 연산 결과를 Lambda & Stream을 활용하여 조건에 맞도록 조회하는 메서드를 구현한다.

오늘은 어제 1,2를 구현하면서 대강만 짜놨던 3번 요구사항을 세부 구현해보았다.

어제는 아래 코드와 같이 메서드를 하나만 추가해놨었다.

    public void printResultGreaterThan(Number value) {
        String str = result.stream()
                .filter(v -> v > value.doubleValue())
                .map(String::valueOf)
                .collect(Collectors.joining(", "));
        System.out.println(str);
    }

1. 리스트 필터링 로직 분리하기

여러 조건으로 리스트를 필터링하는 로직을 따로 모듈로 뽑아야겠다고 생각했다.

그 이유는 다음과 같다.

  1. 재사용성을 높일 수 있다. (지금 과제에서는 재사용할 일이 없기는 하지만)
  2. 로직을 테스트하기 용이하다.
    • 만일 분리하지 않는다면 해당 필터링 로직이 올바르게 수행되는가를 확인하기 위해서 Calculator 인스턴스를 만들어야하고, 피연산자와 연산자를 입력해서 결과값을 만들어주는 작업을 해야한다.
    • 필터링 로직만 분리해놓는다면 List만 구성해서 간단하게 테스트할 수 있다.

✅  NumberListFilter 구현

import java.util.List;
import java.util.stream.Collectors;

public class NumberListFilter {
    public static <T extends Number> List<T> findAllGreaterThan(List<T> list, Number value) {
        return list.stream()
                .filter(v -> v.doubleValue() > value.doubleValue())
                .collect(Collectors.toList());
    }

    public static <T extends Number> List<T> findAllLessThan(List<T> list, Number value) {
        return list.stream()
                .filter(v -> v.doubleValue() < value.doubleValue())
                .collect(Collectors.toList());
    }

    public static <T extends Number> List<T> findAllEqualTo(List<T> list, Number value) {
        return list.stream()
                .filter(v -> v.doubleValue() == value.doubleValue())
                .collect(Collectors.toList());
    }
}
  • 조건에 맞게 필터링한 리스트를 반환하는 `static 메서드`로 구성하였다.
  • Number를 상속한 모든 타입의 리스트에 대해 적용이 가능하도록 `제네릭 메서드`로 구현하였다.
  • 모든 메서드에서 stream을 사용했다.

2. 계산기 클래스 : 결과 필터링 조회 메서드 추가하기

이제 계산기 클래스에 NumberListFilter를 사용하는 조회 메서드를 추가해보자.

  public void printResultGreaterThan(Number value) {
      String resultStr = NumberListFilter.findAllGreaterThan(result, value)
              .stream()
              .map(String::valueOf)
              .collect(Collectors.joining(", "));
      System.out.println(resultStr);
  }

  public void printResultLessThan(Number value) {
      String resultStr = NumberListFilter.findAllLessThan(result, value)
              .stream()
              .map(String::valueOf)
              .collect(Collectors.joining(", "));
      System.out.println(resultStr);
  }

  public void printResultEqualTo(Number value) {
      String resultStr = NumberListFilter.findAllEqualTo(result, value)
              .stream()
              .map(String::valueOf)
              .collect(Collectors.joining(", "));
      System.out.println(resultStr);
  }
  • 이제 필터링 로직은 NumberListFilter가 수행하고, 계산기 클래스는 이를 포맷팅하여 출력하는 작업만 수행한다.

그런데 또 반복되는 코드들이 눈에 들어온다.

필터링 된 List 요소를 String으로 변환하고, 하나의 문자열로 합치는 작업이다. 이 작업도 메서드로 분리했다.

✅  각 메서드 구현

  public void printResultGreaterThan(Number value) {
      System.out.println(joinToString(NumberListFilter.findAllGreaterThan(result, value)));
  }

  public void printResultLessThan(Number value) {
      System.out.println(joinToString(NumberListFilter.findAllLessThan(result, value)));
  }

  public void printResultEqualTo(Number value) {
      System.out.println(joinToString(NumberListFilter.findAllEqualTo(result, value)));
  }

  private String joinToString(List<Double> list) {
      return list.stream()
              .map(String::valueOf)
              .collect(Collectors.joining(", "));
  }
}

 

아주 깔끔해졌다 ✨


 

저작자표시 비영리 변경금지 (새창열림)

'공부하기 > Java' 카테고리의 다른 글

[Java] Stream 함수에서 인덱스 사용하기 (키오스크 과제)  (1) 2025.01.16
🧐 계산기 과제를 마무리하는데 생겨난 궁금증 : Generics 사용  (0) 2025.01.09
[Java] 추상클래스 vs 인터페이스, 언제 어떤 것을 사용할까?  (1) 2025.01.07
계산기 과제 : Java Generics, Enum 활용기  (0) 2025.01.06
Java Enum 이놈아  (1) 2025.01.03
'공부하기/Java' 카테고리의 다른 글
  • [Java] Stream 함수에서 인덱스 사용하기 (키오스크 과제)
  • 🧐 계산기 과제를 마무리하는데 생겨난 궁금증 : Generics 사용
  • [Java] 추상클래스 vs 인터페이스, 언제 어떤 것을 사용할까?
  • 계산기 과제 : Java Generics, Enum 활용기
다섯자두
다섯자두
All I need is 💻 , ☕️ and a dash of luck
  • 다섯자두
    subbni
    다섯자두
  • 전체
    오늘
    어제
    • 전체 글 (88) N
      • 개발 이야기 (0)
      • 만들어보기 (17)
        • FromBookToBook (5)
        • Spring (5)
        • Node.js & React (3)
        • TroubleShooting (4)
      • 공부하기 (71) N
        • Network (3)
        • Cloud (1)
        • Database (5)
        • Java (13)
        • Javascript (0)
        • Spring (9)
        • React (18)
        • Algorithm (8)
        • 자료구조 (7)
        • ETC (7) N
      • 회고 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • velog
  • 공지사항

  • 인기 글

  • 태그

    Database
    실시간 데이터 전송 기술
    springboot
    pdf 프리뷰 실패
    오블완
    Til
    aws
    HTTP
    Express
    SSE
    알고리즘
    Spring
    로그인
    outbox 패턴
    mysql
    redis
    pdf 자동 다운로드
    자료구조
    SQL
    프로젝트
    재시도 로직
    최단거리
    알림 기능
    java
    티스토리챌린지
    outbox
    SQS
    network
    JPA
    서명알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
다섯자두
계산기 과제 : 계산 결과 Lambda&Stream 필터링 조회 구현하기
상단으로

티스토리툴바