※ map

: Observable이 발행한 모든 데이터를 Function 객체를 적용해 일괄적으로 바꿔서 Observer에게 전달한다. 다음 예를 보자.

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)
			.map(new Function<String, String>(){
				@Override
				public String apply(String t) throws Exception {
					return "String : " + t;
				}
				
			})
			.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!!!");
				}
			});
	}
}

- 결과

위 코드에서 map()에 대해 람다를 적용하면 다음과 같은 코드가 된다.

.map(str-> "String: " + str)


※ flatMap, concatMap, switchMap

: map은 Observable가 Observer에게 전달할 모든 데이터를 변경한다. 즉 map은 데이터들을 반환하는 것이다. flatMap은 데이터가 아닌 Observable이 발행한 데이터에 flatMap에서 기술한 Observable을 적용한다. 다음 예를 보자. flatMap 안에서 Observable을 기술한 걸 볼 수 있다. 처음 Observable이 발행한 str1, str2, str3 각각에 대해서 flatMap에서 기술한 Observable이 적용된다. 결과 사진을 보면 확실히 알 수 있다.
public class main {
	public static void main(String[] args){
		
		String str1 = "Apple";
		String str2 = "Banana";
		String str3 = "Boy";
		
		Observable.just(str1, str2, str3)
			.flatMap(str->Observable.just("1. "+str, "2. "+str, "3. "+str," End"))
			.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!!!");
				}
			});
	}
}

- 결과

flatMap을 사용할 경우 데이터의 순서가 보장이 안 된다. 위 예에서는 데이터 순서가 보장됬지만 복잡한 로직을 가지고 있다면 "Banana"가 "Apple"보다 먼저 나올 수도 있다. 이렇게 순서가 중요하다면 concatMap()을 사용하면 된다. switchMap()은 flatMap과 비슷하다. 하지만 위 예에서 switchMap()을 사용하고 1.Banana가 발행되고 1.Boy, 2.Boy, 3.Boy, End가 발행됬다면 1.Banana는 Observer에게 전달되지 않는다.   


※ scan

: scan은 Observable이 Observer에 전달한 데이터를 다음에 Observer에 전달할 데이터에 이용한다. 말로는 어려운데 다음 예를 보면 바로 알 수 있다. 결과를 보면 제일 먼저 Observer에 전달된 str1이 scan 내부 sum+str에서 sum에 대입된다. 따라서 Observer에 str1+str2가 전달된다. 이와 마찬가지로 다음에는 str1+str2가 sum에 대입되 str1+str2+str3가 Observer에 전달된다.

public class main {
	public static void main(String[] args){
		
		String str1 = "Apple";
		String str2 = "Banana";
		String str3 = "Boy";
		
		Observable.just(str1, str2, str3)
			.scan((sum, str) -> sum+str)
			.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!!!");
				}
			});
	}
}
- 결과




+ Recent posts