※ repeat()

: repeat는 말 그대로 데이터를 반복해서 전달한다는 뜻이다. 다음 예를 보면 정확히 이해될 것이다. 아래 예에서 문자열들에 대해 repeat(3)를 호출했다. 따라서 just에 전달된 first, second, third 문자열 객체가 Observer에게 전달되는 데 3번 반복해서 전달한다. 따라서 결과를 보면 first, second, third가 3번씩 출력되는 걸 알 수 있다.

public class main {
	public static void main(String[] args){
		String first = "first";
		String second = "second";
		String third = "third";
		
		Observable.just(first,second,third)
			.repeat(3)
			.subscribe(new DefaultObserver<String>() {

				@Override
				public void onNext(String t) {
					System.out.println(t);
				}

				@Override
				public void onError(Throwable e) {
					System.out.println("Error!!!!");
				}

				@Override
				public void onComplete() {
					System.out.println("Complete!!!");
				}
			});
	}
}

- 결과


※ range()

: range는 특정 값 X로부터 N개의 정수 데이터를 전달한다. 다음 예를 보자. 다음 예는 정수 10, 11, 12를 Observer에게 전달한다.

public class main {

public static void main(String[] args){

Observable.range(10,3)

.subscribe(new DefaultObserver<Integer>() {


@Override

public void onNext(Integer t) {

System.out.println("Number : "+t);

}


@Override

public void onError(Throwable e) {

System.out.println("Error!!!!");

}


@Override

public void onComplete() {

System.out.println("Complete!!!");

}

});

}

}

- 결과



※ filter()

: filter는 Observable에서 Observer에 전달한 데이터 중에서 특정 조건에 만족하는 데이터만 Observer에 전달해준다. 다음의 예를 보자. 일반적으로 filter는 null 값을 확인할 때 많이 사용한다. 

public class main {
	public static void main(String[] args){
		
		String str1 = "Apple";
		String str2 = "Banana";
		String str3 = "Boy";
		String str4 = "Girl";
		
		Observable.just(str1, str2, str3, str4)
			.filter(new Predicate<String>() {
				@Override
				public boolean test(String t) throws Exception {
					return !t.startsWith("B");
				}			    
			})
			.subscribe(new DefaultObserver<String>() {

				@Override
				public void onNext(String t) {
					System.out.println(t);
				}

				@Override
				public void onError(Throwable e) {
					System.out.println("Error!!!");}

				@Override
				public void onComplete() {
					System.out.println("Complete!!!");
				}
			});
	}
}

- 결과

위 예제 코드의 filter에 람다를 적용하면 간결해진다. 

.filter(str-> !str.startsWith("B"))


※ take(), takeLast()

: take(i)는 Observable에서 Observer에 전달하는 데이터 중 첫 번째 데이터부터 i번째 데이터까지만 Observer에 전달한다는 의미이다. takeLast(i)는 반대로 마지막 데이터부터 뒤로 i번째 데이터까지만 Observer에 전달한다는 의미이다.



※ distinct()

: 데이터의 중복을 제거해준다. distinctUntilChanged()는 똑같은 값을 옵저버블이 발행하다가 새로운 값을 발행할 때 Observer에게 데이터를 전달한다.

public class main {
	public static void main(String[] args){
		
		String str1 = "Apple";
		String str2 = "Banana";
		String str4 = "Girl";
		
		Observable.just(str1, str2, str2, str4)
			.distinct()
			.subscribe(new DefaultObserver<String>() {

				@Override
				public void onNext(String t) {
					System.out.println(t);
				}

				@Override
				public void onError(Throwable e) {
					System.out.println("Error!!!");}

				@Override
				public void onComplete() {
					System.out.println("Complete!!!");
				}
			});
	}
}

- 결과



※ first(), last()

: 이름 그대로 Observable이 첫 번째랑 마지막 데이터만 Observer에게 전달한다.


※ skip(), skipLast()

: take()와 반대라고 생각하면 된다. skip(i)는 Observable의 모든 데이터에서 첫 번째부터 i번째 데이터를 생략하고 Observer에게 보낸다. skipLast()는 마지막부터 뒤에서 i번째 데이터를 생략하고 Observer에게 보낸다.


※ elementAt()

: Observable이 발행한 데이터 중에서 i번째 데이터만 Observer에게 보낸다.


※ sample(), timeout(), debounce()

: sample(30, TimeUnit.SECONDS)를 Observable에게 적용하면 30초 마다 Observable이 가장 최근에 발행한 데이터를 Observer에게 보낸다. 시간 간격에서 가장 마지막(최근)이 아닌 첫 번째 데이터를 받고 싶다면 throttleFirst()를 사용하면 된다. timeout()은 sample()과 거의 비슷하지만 시간 간격 내에 Observable이 데이터를 발행하지 않을 경우 Observer의 onError을 호출한다. debounce()는 timeout()과 달리 시간 간격 내에 Observable이 데이터를 발행하지 않을 경우 가장 최근에 발행한 데이터를 Observer에게 전달한다.



+ Recent posts