본문 바로가기
2023년 이전/ReativeX

RxJava, RxKotlin - filter

by JeongUPark 2019. 11. 13.
반응형

[출처 - RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에]

본 글은 'RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에' 를 학습하면서 정리한 글입니다


마블다이어그램 참고 - http://reactivex.io/RxJava/javadoc/io/reactivex/Flowable.html#filter-io.reactivex.functions.Predicate-

 

filter는 문자 그대로 원하는 데이터만을 걸러내는 기능을 하는 함수입니다.

 

마블다이어그램을 보면

입력이 들어오면 filter를 통하여 원만 받습니다.

 

구현을 보면

JAVA

import io.reactivex.Observable;

public class filter_test {

    public static void main(String[] args){
        String[] objs = {"Circle","Diamond","Triangle","Diamond_2","Circle_2", "Hexagon"};
        Observable observable = Observable.fromArray(objs).filter(obj->obj.contains("Circle"));
        observable.subscribe(System.out::println);
    }
}

Kotlin

import io.reactivex.rxkotlin.toObservable

fun main(){
    val objs = arrayOf("Circle","Diamond","Triangle","Diamond_2","Circle_2", "Hexagon");
    var observable = objs.toObservable().filter{obj->obj.contains("Circle")}
    observable.subscribe(System.out::println)
}

결과는 

code를 보면 filter 안은 사실

import io.reactivex.Observable;
import io.reactivex.functions.Predicate;

public class filter_test {

    public static void main(String[] args){
        String[] objs = {"Circle","Diamond","Triangle","Diamond_2","Circle_2", "Hexagon"};
        Observable observable = Observable.fromArray(objs).filter(new Predicate<String>() {
            @Override
            public boolean test(String s) throws Exception {
                return    s.contains("Circle");
            }
        });
        observable.subscribe(System.out::println);
    }
}

Predicate를 인자로 넣습니다. Predicate는 진위 판별이란 뜻으로 boolean을 return하고 ture일 경우 구독할 수 있습니다.

하지만 굳이 Predicate를 안쓰고 람다 형식으로 편하게 coding 할 수 있습니다.

 

그리고 filter 함수와 비슷한 함수들이 있습니다.

first(default)함수 : Observable의 첫번 째 값을 필터합니다. 값이 없이 완료되면 default를 리턴합니다.

last(default)함수 : Observable의 마지막 값을 필터합니다. 값이 없이 완료되면 default를 리턴합니다.

take(N) 함수: 최초 N개 값만 가져옵니다.

takeLast(N) 함수: 마지막 N개 값만 가져옵니다.

skip(N) 함수 : 최초 N개 값을 건너 뜁니다.

skipLast(N) 함수 : 마지막 N개 값을 건너 뜁니다.

 

테스트를 해보면

JAVA

import io.reactivex.Observable;
import io.reactivex.Single;

public class similar_filter_test {

    public static void main(String[] args){
        Integer[] numbers = {100,200,300,400,500,600};
        Single<Integer> single;
        Observable<Integer> observable;

        // first
        single = Observable.fromArray(numbers).first(-1);
        single.subscribe(it -> System.out.println("first: "+it));
        // last
        single = Observable.fromArray(numbers).last(-2);
        single.subscribe(it -> System.out.print("last: "+it));
        //take
        observable = Observable.fromArray(numbers).take(3);
        observable.subscribe(it -> System.out.println("take 3: "+it));
        //takeLast
        observable = Observable.fromArray(numbers).takeLast(2);
        observable.subscribe(it -> System.out.println("takeLast 2 : "+it));
        //skip
        observable = Observable.fromArray(numbers).skip(3);
        observable.subscribe(it -> System.out.println("skip 3 : "+it));
        //skipLast
        observable = Observable.fromArray(numbers).skipLast(2);
        observable.subscribe(it -> System.out.println("skip 2 : "+it));
    }
}

Kotlin

import io.reactivex.Observable
import io.reactivex.Single

fun main(){
    val numbers = arrayOf(100, 200, 300, 400, 500, 600)
    var single: Single<Int>
    var observable: Observable<Int>

    // first
    single = Observable.fromArray(*numbers).first(-1)
    single.subscribe { it -> println("first: " + it!!) }
    // last
    single = Observable.fromArray(*numbers).last(-2)
    single.subscribe { it -> print("last: " + it!!) }
    //take
    observable = Observable.fromArray(*numbers).take(3)
    observable.subscribe { it -> println("take 3: " + it!!) }
    //takeLast
    observable = Observable.fromArray(*numbers).takeLast(2)
    observable.subscribe { it -> println("takeLast 2 : " + it!!) }
    //skip
    observable = Observable.fromArray(*numbers).skip(3)
    observable.subscribe { it -> println("skip 3 : " + it!!) }
    //skipLast
    observable = Observable.fromArray(*numbers).skipLast(2)
    observable.subscribe { it -> println("skip 2 : " + it!!) }
}

이고 결과는

first: 100
last: 600take 3: 100
take 3: 200
take 3: 300
takeLast 2 : 500
takeLast 2 : 600
skip 3 : 400
skip 3 : 500
skip 3 : 600
skip 2 : 100
skip 2 : 200
skip 2 : 300
skip 2 : 400

이렇게 나타납니다.

반응형

'2023년 이전 > ReativeX' 카테고리의 다른 글

RxJava,RxKotlin - Interval  (0) 2019.11.20
RxJava,RxKotlin - reduce  (0) 2019.11.13
flatMap을 이용한 구구단 만들기  (0) 2019.11.13
RxJava,RxKotlin - flatMap()  (0) 2019.11.13
RxJava,RxKotlin - Map()  (0) 2019.11.13