본문 바로가기
Rx

리액티브연산자 -4 (filter함수,first,last,take,skip)

by 봄석 2018. 12. 24.

본 내용은 필자가 학습한 내용을 정리하는 내용입니다.

대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다!

RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에

유동환 , 박정준 지음 | 한빛미디어 | 2017년 09월 04일 출간

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968488658&orderClick=LAV&Kc=


저자님의 블로그

https://brunch.co.kr/@yudong#info




filter()함수

filter함수는 Observable에서 원하는 데이터만 걸러내는 역할을 합니다.

즉 필요없는 데이터는 제거하고, 원하는 데이터만 filter()함수를 통과하게 됩니다.


filter()함수의 마블다이어그램

출처 - http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html


다이어그램을 보면 오직 동그란 원의 모양만 통과시킵니다.


filter()함수의 활용 예

String[] objs= {"1 CIRCLE","2 C DIAMOND","3 TRIANGLE","4 DIAMOND","5 CIRCLE","6 HEXAGON"};
        
Observable<String> source= Observable.fromArray(objs)
            .filter(obj->obj.endsWith("CIRCLE"));

source.subscribe(System.out::println);

Objs변수에는 Observable이 발행하는 데이터가 들어있습니다.filter()함수에는 원만 통과시킬수 있게 하므로 실행결과는 아래와 같습니다.

1 CIRCLE 5 CIRCLE
filter() 함수에는 boolean 값을 리턴하는 함수형 인터페이스 인 Predicate를 인자로 넣습니다

(map()과 flatMap()함수에서 Function객체를 넣은 것과는 다릅니다.) Predicate는 진위판별 이라는 뜻이 있으며 boolean 값을 리턴하는 특수한 함수형 인터페이스 입니다.

따라서 람다 표현식으로 인자를 넣으면 Function인지 Predicate인지 신경쓰지 않고 동일하게 코딩 할 수있다는 장점이있습니다(판별은 컴파일러가)


앞에서 사용한 람다표현식을 Predicate 타입의 함수로 만들면 아래와 같습니다

Predicate<String> filterCircle =obj ->obj.endWith("CIRCLE");



filter() 함수를 이용한 짝수 판별 예

Integer[] data={100,34,27,99,50};
Observable<Integer> source= Observable.fromArray(data)
            .filter(number->number%2==0);

        source.subscribe(System.out::println);



filter() 함수와 비슷한 함수들


 first(default) 함수 : Observable의 첫 번째 값을 필터함. 만약 값없이 완료되면 대신 기본값을 리턴함.



 last( defulat) 함수 : Observable의 마지막 값을 필터함. 만약 값없이 완료되면 대신 기본값을 리턴함.



 take( N) 함수 : 최초 N개 값만 가져옴.



 takeLast( N) 함수 : 마지막 N개의 값만 필터함.



 skip( N) 함수 : 최초 N개 값을 건너뜀.



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



filter() 함수와 비슷한 함수들의 활용 예

Integer[] numbers ={100,200,300,400,500};
Single<Integer> single;
Observable<Integer> source;
        
//1. first
single =Observable.fromArray(numbers).first(-1);
single.subscribe(data->System.out.println("first() value = "+data));
        
//2. last
single =Observable.fromArray(numbers).last(999);
single.subscribe(data->System.out.println("last() value = "+data));
        
//3. take
source =Observable.fromArray(numbers).take(3);
source.subscribe(data->System.out.println("take(3) value = "+data));
        
//4. takeLast(N)
source =Observable.fromArray(numbers).takeLast(3);
source.subscribe(data->System.out.println("takeLast(3) value = "+data));
                
//5. skip(N)
source =Observable.fromArray(numbers).skip(2);
source.subscribe(data->System.out.println("skip(2) value = "+data));
        
//5. skipLast(N)
source =Observable.fromArray(numbers).skipLast(2);

 source.subscribe(data->System.out.println("skipLast(2) value = "+data));



결과값

first() value = 100
last() value = 500
take(3) value = 100
take(3) value = 200
take(3) value = 300
takeLast(3) value = 300
takeLast(3) value = 400
takeLast(3) value = 500
skip(2) value = 300
skip(2) value = 400
skip(2) value = 500
skipLast(2) value = 100
skipLast(2) value = 200

skipLast(2) value = 300


댓글