맨땅에 헤딩하는 개바른자

[Java] Stream > Filter 본문

JAVA/Stream

[Java] Stream > Filter

앵낄낄 2023. 5. 31. 16:04
반응형

Git

https://github.com/ymwoo88/stream/tree/feature/filter-%EC%98%88%EC%A0%9C

설명

Stream의 Filter API는 Predicate에서 true를 반환하는 데이터만 존재하는 Stream을 리턴하는 기능을 제공합니다.

  • filter는 and조건으로 중첩적용이 가능하나 or조건은 사용되지 않습니다.

Filter

Stream<T> filter(Predicate<? super T> predicate);

예제

  • 샘플 데이터

    @Getter
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class User {
      private Long id;
      private String name;
      private String email;
      private Integer age;
    
      public static User getUserAmil() {
          return User.builder()
                  .id(1L)
                  .name("amil")
                  .email("amil@ymwoo.com")
                  .age(35)
                  .build();
      }
    
      public static User getUserBenny() {
          return User.builder()
                  .id(2L)
                  .name("benny")
                  .email("benny@ymwoo.com")
                  .age(29)
                  .build();
      }
    
      public static User getUserCho() {
          return User.builder()
                  .id(3L)
                  .name("cho")
                  .email("cho@ymwoo.com")
                  .age(33)
                  .build();
      }
    
      public static List<User> getExamUserList() {
          return Arrays.asList(getUserAmil(), getUserCho(), getUserBenny());
      }
    }
  • 예제1) 단건 필터링

      @Test
      @DisplayName("user name이 amil 인경우 필터링")
      void case1() {
          List<User> examUserList = User.getExamUserList();
          List<User> filteredUser = examUserList
                  .stream()
                  .filter(user -> "amil".equals(user.getName()))
                  .toList();
          // 결과 출력
          filteredUser
                  .forEach(user -> log.info(">>> Filtered User Info = {}", user));
      }
    15:30:32.130 [Test worker] INFO com.ymwoo.stream.filter.StreamFilterTest -- >>> Filtered User Info = User(id=1, name=amil, email=amil@ymwoo.com, age=35)
  • 예제2) 다건 필터링

      @Test
      @DisplayName("30대 이하이면서 일하는 중인경우 필터링")
      void case2() {
          List<User> examUserList = User.getExamUserList();
          List<User> filteredUser = examUserList
                  .stream()
                  .filter(user -> 30 > user.getAge())
                  .filter(User::getIsWorking)
                  .toList();
          // 결과 출력
          filteredUser
                  .forEach(user -> log.info(">>> Filtered User Info = {}", user));
      }
    15:52:12.338 [Test worker] INFO com.ymwoo.stream.filter.StreamFilterTest -- >>> Filtered User Info = User(id=1, name=amil, email=amil@ymwoo.com, age=25, isWorking=true)
    15:52:12.345 [Test worker] INFO com.ymwoo.stream.filter.StreamFilterTest -- >>> Filtered User Info = User(id=2, name=benny, email=benny@ymwoo.com, age=29, isWorking=true)

참조

https://backtony.github.io/java/2022-02-06-java-46/

반응형

'JAVA > Stream' 카테고리의 다른 글

[Java] Stream > distinct  (0) 2023.06.08
[Java] Stream > flatMap  (0) 2023.06.08
[Java] Stream > map  (0) 2023.06.08
[Java] Stream > sorted  (0) 2023.05.31
[Java] Stream  (0) 2023.05.24