Study/java

[Java] Stream - filter : 스트림 데이터 필터링

 

Stream.filter란?

filter는 특정 조건에 맞는 요소만을 추출하여 새로운 스트림을 생성하는 데 사용됩니다.

Predicate로 조건을 만들어서 filter 메서드에 매개변수로 넣어주면 조건에 맞는 요소만 가지고 새로운 스트림이 만들어집니다.

Java Stream Filter 메소드 공식 문서 바로가기

 

Stream (Java Platform SE 8 )

A sequence of elements supporting sequential and parallel aggregate operations. The following example illustrates an aggregate operation using Stream and IntStream: int sum = widgets.stream() .filter(w -> w.getColor() == RED) .mapToInt(w -> w.getWeight())

docs.oracle.com

 

 

Stream.filter 기본 사용법

정수 리스트에서 짝수만 추출

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);

list.stream()
    .filter(num -> num % 2 == 0)
    .forEach(num -> System.out.println(num));

filter 결과

정수 리스트에서 짝수만 뽑는 예제입니다.

 

Predicate 클래스는 함수형 인터페이스로, 조건식을 표현하는 데 사용됩니다.

예제처럼 num → num % 2 == 0과 같이 변수 → 구현의 형태를 가집니다.

 

 

 

 

 

 

글자수, 특정 문자 포함여부 필터링하여 추출

List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("car");
list.add("dog");
list.add("elephant");

list.stream()
    .filter(isLongerThan3().and(isContainE()))
    .forEach(s -> System.out.println(s));

// ----------------------------------

private static Predicate<String> isLongerThan3() {
    return s -> s.length() > 3;
}

private static Predicate<String> isContainE() {
    return s -> s.contains("e");
}

3글자 초과, e 포함 문자열 필터 결과

위 예제에서는 두 개의 Predicate를 사용하여 3글자 초과하고 'e'를 포함하는 문자열만 추출합니다.

isLongerThan3와 isContainE 메서드는 각각 길이가 3을 초과하는지와 'e'를 포함하는지 확인하는 Predicate를 반환합니다.

이 두 조건을 and 메서드로 결합하여 필터링에 사용합니다.

 

이처럼 Predicate를 사용하면 여러 조건들로 Stream을 필터링할 수 있습니다.

 

filter 여러개 사용법

filter의 반환값은 Stream이기 때문에 여러개의 filter를 걸 수 있습니다.

List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 50; i++) {
    list.add(i);
}

list.stream()
    .filter(n -> n % 2 == 0)
    .filter(n -> n % 3 == 0)
    .filter(n -> n % 5 == 0)
    .forEach(n -> System.out.println(n));

여러 필터 적용 결과

위 예제에서는 여러 개의 필터를 연속으로 사용하여 조건을 좁혀 나갑니다.

리스트에서 짝수만 추출하고, 그 중에서 3의 배수를 추출하며, 최종적으로 5의 배수만 추출합니다.

 

복잡한 조건 필터링

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

...

List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("apricot");
list.add("avocado");
list.add("cherry");

list.stream()
    .filter(startsWithA().and(hasLengthMoreThan5()))

    
 //----------------------------------------------------------------

private static Predicate<String> startsWithA() {
    return s -> s.startsWith("a");
}

private static Predicate<String> hasLengthMoreThan5() {
    return s -> s.length() > 5;
}

위 예제에서는 'a'로 시작하고 길이가 5를 초과하는 문자열을 필터링합니다.

startsWithA와 hasLengthMoreThan5 메서드는 각각 'a'로 시작하는지와 길이가 5를 초과하는지 확인하는 Predicate를 반환합니다.

 

이처럼 filter를 연속으로 사용해도 되고, Predicate로 조건을 여러 개 사용할 수도 있습니다.

 

 

 

읽으면 좋은 글

[Java] Stream - map: 스트림 값 변환

 

[Java] Stream - map: 스트림 값 변환

자바 Stream의 map 메서드는 주어진 함수를 적용한 새로운 스트림을 만들어주는 메서드입니다. mapmap은 다음과 같이 사용합니다.List list = new ArrayList();list.add(1);list.add(2);list.add(3);list.stream().map(num ->

priming.tistory.com