[출처 - 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 |