티스토리 뷰

반응형
SMALL

리액티브 X에는 다양한 연산자 함수가 있습니다. 이 연산자 함수들의 개수는 Rx 버전이 올라갈수록 계속 증가하고 있습니다.

하지만 기본적인 함수들을 익혀놓으면 이후에는 필수 연산자에서 파생된 연산자 함수들이기 때문에 이해할 수 있습니다.

 

리액티브 연산자의 특징은 언어 특성과 크게 연관이 없습니다.

RxJava, RxKotlin, RxJS, RxSwift 등 언어적인 부분에서 말고는 연산자의 기능이 크게 다르지 않습니다.

리액티브 연산자는 함수형 프로그래밍 관점에서 보았을 때 순수 함수입니다.

 

이번 포스트에서는 다양한 연산자 함수 중 변환 연산자에 대해 알아보도록 하겠습니다.

Transforming 연산자에는 map()과 flatMap() 두 가지가 있습니다.

 

1. map() 함수

map() 함수는 입력된 값을 어떤 함수에 넣어서 원하는 형태의 값으로 변환하는 함수입니다.

map() 함수를 나타내는 마블 다이어그램

map() 함수는 입력되는 데이터와 그것을 Return 시켜줄 수 있는 어떤 중개역할을 하는 도구가 있다고 생각하면 됩니다. 위에 그림을 보면 원을 입력받아서 다이아몬드를 반환하는 것을 볼 수 있습니다. 

만약 간단하게 1을 넣으면 "1개" 라고 반환되는 함수를 자바로 만들어본다면 어떨까요?

public static String getCountString(String count) {
	return count + "개";
}

아 이것을 RxJava로 map()을 사용해서 구현하면 다음과 같습니다.

String[] counts = {"1", "2", "3", "4"};
Observable<String> source2 = Observable.fromArray(counts)
    .map(count -> count + "개");
source2.subscribe(System.out::println);

 

RxJava에서 람다 표현식은 Predicate<T>, Consumer<T>, Function<T, R>의 형태 중 하나로 나타냅니다.

위 코드를 Function 인터페이스를 이용해 분리하면 아래와 같습니다.

Function<String, String> getCountString = count -> count + "개";

String[] counts = {"1", "2", "3", "4"};
Observable<String> source2 = Observable.fromArray(counts).map(getCountString);
source2.subscribe(System.out::println);

map() 함수는 반드시 입력 타입과 반환 타입이 같을 필요는 없습니다. String으로 입력을 받아도 Integer로 반환해도 됩니다.

다음 코드는 색상이 적힌 원을 넣으면 적절한 숫자로 반환해주는 예제 코드입니다.

Function<String, Integer> ballToIndex = ball -> {
    switch (ball) {
        case "RED": return 1;
        case "YELLOW": return 2;
        case "GREEN": return 3;
        case "BLUE": return 5;
        default: return -1;
    }
};

String[] balls2 = {"RED", "YELLOW", "GREEN", "BLUE"};
Observable<Integer> source3 = Observable.fromArray(balls2).map(ballToIndex);
source3.subscribe(System.out::println);

 

2. flatMap() 함수

flatMap() 함수는 map()을 좀 더 발전시킨 함수입니다. map() 함수는 원하는 입력 값을 어떤 함수에 넣어서 반화할 수 있는 1:1함수입니다. 하지만 flatMap() 함수는 Observable 형태로 나온다는 것이 map()과 다릅니다.

map()이 1:1이라면 flatMap()은 일대 다 혹은 일대일 Observable 함수가 됩니다.

빨간 색 원을 넣으면 빨간색 원 2개가 나옵니다. 마찬가지로 녹색원과 파란색 원을 넣으면 각각 2개씩 반환됩니다.

Observable 형태로 반환되기 때문에 여러 개의 데이터를 발행할 수 있습니다. 위에 마블 다이어그램 상으로는 2개씩 반환되어서 2개씩만 된다고 생각할 수도 있지만 1개도 가능하고 더 많이도 가능합니다.

Function<String, Observable<String>> getDoubleStars = 
    ball -> Observable.just(ball + "*", ball + "*");
    
String[] balls = {"1", "3", "5"};
Observable<String> source = Observable.fromArray(balls).flatMap(getDoubleStars);
source.subscribe(System.out::println);

함수형 프로그래밍에서는 함수가 일급 객체이므로 함수가 입력값을 들어갈 수도 출력으로 들어갈 수도 있습니다.

따라서 여러 개의 데이터가 나올 수도 있다는 것입니다.

 

마블 다이어그램과 다른 점은 다이어그램에서는 녹색, 파란색 순서로 나왔는데 위의 코드를 실행하면 1/1/3/3/5/5 순서로 나옵니다.

이유는 후반부에서 다시 살펴보겠습니다.

 

이번에는 Function 인터페이스를 안쓰고 인라인으로 람다 표현식을 넣는 방법에 대해 살펴보도록 하겠습니다.

Observable<String> source = Observable.fromArray(balls)
                .flatMap(ball -> Observable.just(ball + "*", ball + "*"));

RxJava에서 여러 개의 데이터를 발행하는 방법은 Observable밖에 없습니다.

 

 

(작성중)

 

 

반응형
LIST

'프로그래밍언어 > RxJava' 카테고리의 다른 글

RxJava - 스케쥴러 (Scheduler)  (0) 2019.09.02
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함