<RxJava>Filter

진섭·2023년 5월 27일
0

RxJava

목록 보기
9/20
post-thumbnail

📌 Filter 연산자란?

이름 그대로 특정 조건을 만족하는 항목들만 배출한다. 특정 조건을 만족하는 값을 필터링 하거나 불필요한 값을 거르고 싶을 때 사용하면 유용하게 쓸 수 있습니다.

📌 Filter 사용법

  • Filter 내부를 들여다 보면 다음과 같이 구현이 되어있는데 filter 메소드는 @NonNull Predicate<? super T> predicate를 파라미터로 받고 있고 @NonNull 어노테이션이 붙어있는걸 보아 null을 허용하지 않는 걸로 보이며 Predicate 내부를 들어가 보니 주어진 입력 값을 테스트하고 boolean을 반환하는 인터페이스가 있었습니다.
  • return 문을 살펴보면 ObservableFilter을 인스턴스로 만들고 ObservableFilter는
    원본 Observable과 predicate를 인자로 받아 생성되며, 필터링된 값을 발행합니다.
  • RxJavaPlugins.onAssembly를 사용하여 ObservableFilter 인스턴스를 감싸는 래퍼 Observable 생성합니다.
  • 이렇게 생성된 Observable은 필터링된 값을 발행하도록 동작하며 필터링된 값들을 전달한다.
    public final Observable<T> filter(@NonNull Predicate<? super T> predicate) {
        Objects.requireNonNull(predicate, "predicate is null");
        return RxJavaPlugins.onAssembly(new ObservableFilter<>(this, predicate));
    }

Filter 예제

  • 이 코드는 뉴진스 멤버중에서 20살 멤버를 필터링 해보도록 하겠습니다.
  • 먼저 NewJeans 라는 변수명으로 데이터 클래스를 기반으로 NewJeans 객체들의 리스트를 newJeansList 변수에 넣어줬습니다.
  • filter 함수는 Observable.fromIterable(newJeansList)를 사용하여 newJeansList 리스트를 Observable로 만들어 반환합니다 fromIterable는 Iterable 객체에 포함된 각 값들을 하나씩 발행하는 Observable입니다.
  • 인제 준비는 다했고 MainActivity에서 filter를 사용을 해보겠습니다.
  • filter 함수를 호출해서 filter 연산자를 붙혀 람다를 열어 age == 20으로 NewJeans 객체들을 필터링합니다.
  • 필터링이 된 객체들이 출력이 됩니다.
class MainActivity : AppCompatActivity() {
    companion object {
        const val TAG = "MainActivity"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        filter().filter {
            it.age == 20
        }
            .subscribe(
                {
                    Log.d("filter", "onNext : $it")

                },
                {
                    Log.d("filter", "onError ${it}")
                },
                {
                    Log.d("filter", "20살인 뉴진스 멤버")
                }
            ).let { _ -> }

    }
}

fun filter():Observable<NewJeans>{
    return Observable.fromIterable(newJeansList)
}

val newJeansList= mutableListOf<NewJeans>(
    NewJeans(1,"민지",20),
    NewJeans(2,"하니",20),
    NewJeans(3,"다니엘",19),
    NewJeans(4,"해린",18),
    NewJeans(5,"혜인",16),
)

data class NewJeans
(
    val id: Long,
    val name: String,
    val age: Int
)

출력결과

profile
Android 개발자

0개의 댓글