Language/Java

RxJava란 - 2 Operators

park_juyoung 2019. 1. 26. 17:31

이번에는 데이터를 어떻게 다루는지 Map을 비롯한 Operator를 통해 살펴보겠습니다.



"Hello, world" 출력에 나의 서명을 덧붙이고 싶습니다. 한가지 방법은 Observer를 바꿔보는 것입니다.


1
2
Observable.just(“Hello, world! -Juyoung”)
 .subscribe(s -> System.out.println(s));
cs


이것은 원본의 데이터를 변경하는 것입니다. 이 경우에 Observable을 여러 장소에서 사용하지만 가끔만 서명을 추가하고 싶다면 문제가 생깁니다.


그럼 대신 Subscriber을 변경하는 것은 어떨까?


1
2
Observable.just(“Hello, world!”)
 .subscribe(s -> System.out.println(s + “ -Juyoung”));
cs


이 것도 다른 이유들로 인해 여전히 만족스럽지 못합니다. 

Subscriber은 메인 스레드에서 동작해야 할 수 있으므로 최대한 가벼운 상태로 유지 해야합니다.

더 개념적으로는 Subscriber들은 반응(reacts)하기로 되어 있는 것이지 변화(mutates)시키는 것이 아닙니다.


마지막으로 중관 과정에서 "Hello, world"를 변형시킬수 있다면 좋지 않을까라는 생각입니다.


Operators

아이템 변형 문제를 Operator로 해결하는 방법을 설명하겠습니다.

Operator는 발행된 item들을 원천인 Observable과 최종의 Subscriber 사이에서 조작하기 위해 사용될 수 있습니다.

RxJava에는 수많은 operator들의 있습니다.  더 많은 operator 보기

하지만 유용한 것에 먼저 집중하는 것이 좋다고 생각됩니다.


이 상황에서는 map() operator를 하나의 발행된 아이템을 다른 것으로 변형하는데 사용할 수 있습니다.


1
2
3
4
5
6
7
8
bservable.just(“Hello, world!”)
  .map(new Func1<StringString>() {
    @Override
      public String call(String s) {
        return s + “ -Juyoung”;
      }
    })
  .subscribe(s -> System.out.println(s));
cs


다시 람다를 사용하여 단순화시킬 수 있습니다.

1
2
3
Observable.just(“Hello, world!”)
 .map(s -> s + “ -Dan”)
 .subscribe(s -> System.out.println(s));
cs


map() operator는 기본적으로 아이템을 변형시키는 Observable이다. 우리는 map() 호출을 원하는 만큼 연쇄시켜 마지막 Subscriber에서 소모가능한 형태로 데이터를 완변하게 연마시킬 수 있다.



Key idea #1: Observable와 Subscriber는 무엇이든 할 수 있다.


Observable은 데이터베이스 쿼리이고 Subscriber은 그 결과를 가지고 화면에 보여주는 것일 수 있다.

Observable은 화면의 클릭이고 Subscriber은 그에 대한 반응이 될 수 있다.

 Observable은 인터넷에서 읽은 바이트 스트림이고 Subscriber은 이것을 디스크에 저장하는 것일 수 있다.


Key idea #2: Observable과 Subscriber은 그들 사이의 변형 단계들과는 독립적이다.


Observable과 최종 Subscriber사이에 원하는 만큼 많은 map()호출을 끼어들게 할 수 있다

이것은 쉽게 데이터를 다룰 수 있다.


'Language > Java' 카테고리의 다른 글

RxJava란? -4 Scheduler  (0) 2019.01.26
RxJava - 3 Operators 이어서  (0) 2019.01.26
RxJava란? - 기본 구조  (5) 2019.01.26
JDBC- MariaDB와 Java연동  (0) 2019.01.02
Netty 프로젝트 시작하기-server  (0) 2018.12.16