Java/스트림(Stream)

[Java]Stream 특정 조건을 만족하는 값 가져오는 방법 - filter 메서드

DevStory 2022. 8. 26.

filter 메서드

Stream 클래스에서 제공하는 filter() 메서드는 스트림 요소를 순회하면서 특정 조건을 만족하는 요소로 구성된 새로운 스트림을 반환합니다.

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

filter 메서드 특징

  • filter() 메서드는 중개 연산(intermediate operation)을 수행하므로 새로운 스트림을 생성합니다.
  • 특정 조건을 만족하는 요소로 구성된 새로운 스트림을 생성합니다.
  • filter() 메서드의 매개변수는 함수형 인터페이스인 Predicate입니다. 따라서, 람다 표현식도 전달할 수 있습니다.
  • filter() 메서드의 매개변수에는 한 개의 매개변수를 가지며, Boolean 타입의 값을 반환하는 람다 표현식 또는 Predicate 타입의 객체가 전달되어야 합니다.

예제 1. 짝수 가져오기

다음 예제는 Interger 타입의 List를 스트림으로 변환 후 filter() 메서드를 사용하여 짝수인 값으로 구성된 새로운 스트림을 생성합니다.

public static void main(String args[]) {
  List<Integer> intList =
          new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));

  Stream<Integer> filterResult =
          intList.stream().filter(item -> item % 2 == 0);

  filterResult.forEach(System.out::println);
}

[실행 결과]

2
4
6
8

예제 2. 필터링 기준이 여러 개인 경우

필터링 기준이 여러 개인 경우(조건식이 많은 경우) filter() 메서드를 사용하여 코드를 간략하게 작성할 수 있습니다.

 

다음 예제는 String 타입의 List를 스트림으로 변환 후 아래 조건을 만족하는 문자열로 구성된 새로운 스트림을 생성합니다.

 

[조건문]

- 문자열의 첫 문자가 "A"인 경우

- 문자열의 마지막 문자가 "Z"인 경우

- 문자열의 길이가 3 이상인 경우

public static void main(String args[]) {
  String[] strArray = {"ABC", "BAZ", "AZ", "ABCZ", "CC"};
  List<String> strList =
          new ArrayList<>(Arrays.asList(strArray));

  Stream<String> filterResult =
          strList.stream().filter((item) -> {
              return item.startsWith("A") && item.endsWith("Z") && item.length() >= 3;
          });

  filterResult.forEach(System.out::println);
}

[실행 결과]

ABCZ

예제 3. filter 메서드 반환 결과를 List로 변환

filter() 메서드는 새로운 스트림을 반환합니다. 스트림이 아닌 List로 반환받고 싶다면, filter() 메서드 뒤에 Collectors.toList()를 매개변수로 가지는 collect() 메서드를 호출합니다.

 

다음 예제는 짝수로 구성된 새로운 스트림을 List로 변환합니다.

public static void main(String args[]) {
  List<Integer> intList =
          new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));

  List<Integer> intStreamToList =
          intList.stream().filter(item -> item % 2 == 0).collect(Collectors.toList());

  intStreamToList.forEach(System.out::println);
}

[실행 결과]

2
4
6
8

예제 4. filter 메서드와 map 메서드 호출

filter() 메서드에서 반환된 스트림의 각 요소를 변경하고 싶은 경우 filter() 메서드 뒤에 map() 메서드를 호출합니다.

 

map() 메서드는 스트림을 순회하여 요소를 변경합니다.

 

다음 예제는 filter() 메서드에서 반환된 스트림 요소에 10을 곱한 뒤 List로 변환합니다.

public static void main(String args[]) {
  List<Integer> intList =
          new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));

  List<Integer> intStreamToList =
          intList.stream()
                 .filter(item -> item % 2 == 0)
                 .map(item -> item * 10)
                 .collect(Collectors.toList());

  intStreamToList.forEach(System.out::println);
}

[실행 결과]

20
40
60
80
반응형

댓글