[RxJava] map, flatmap, zip

Jay·2021년 3월 13일
0

RxJava

목록 보기
6/7
post-thumbnail

데이터의 발행자수신자, 그리고 그 사이에 데이터를 변형해주는 변환 연산자(map, flatmap, zip)

데이터 발행자 : Operator(just,create,defer 등으로 분류)

  • Observable
  • Subscriber
  • Single
  • Observer
  • Maybe

데이터 수신자 (Stream이 연결되는 Observer들)

  • Consumer
  • Subject
  • Completable

Map

  • Observable에서 받은 데이터를 -> Observer로 가기전에 변형해주는 함수.
  • 단일 스트림의 원소를 매핑 시킨 후 매핑 시킨 값을 다시 스트림으로 반환하는 중간 연산
  • map()에서는 직접 인자를 -> 새로 변형할 수 있지만, 변형시켜주는 어떠한 람다 함수도 넣을 수 있다.
  • 이 때, 람다함수 Fuction<T,R>에는 들어오는 타입 T, 반환되는 타입 R을 넣어줘야 한다.
  • 단순하게 함수로 받은 데이터를 데이터로만 가공하는 ?
  • 이벤트를 바꾼다. E type 이벤트를 R type 이벤트로!
private void doMap(){
	Function<String, String> getMap = item -> "<"+item+">";
    
    Observable.fromArray(new String[]{"aaa","bbb","ccc","ddd"})
    	.map(getMap)
        .subscribe(
        	item -> data.add(item)
            () -> adapter.notifyDataSetChanged()        
        )
}

flatMap

  • Map과의 차이점은 return 값이 Observable이라는 것!
  • Array나 Object로 감싸져 있는 모든 원소를 단일 원소 스트림으로 반환
  • 이벤트를 다른 Observable로 바꾼다.
  • 그 결과 map이 하나의 item 성분에 대해 하나의 변형된 item만 내놓을 수 있지만, flatmap 속 Observable.just 등에 의해 파라미터 안에서 콤마(,)를 통해
    -> 하나의 item에 대해 여러개의 변형된 item을 발행할 수 있다.
  • 실제 flatmap() 함수의 리턴 값을 보면, map()을 먼저 한 다음 -> merge로 감싸주어 Observable로 반환한다.
  • flatmap에 변형 함수를 집어 넣는 다면, 그 람다함수 Function<T,R>에서는 인풋인 T는 String, 아웃풋인 R은 Observable<String>이 된다.
private void doflatMap(){
	Function<String, Observable<String>> getflatMap = item -> Observable.just(item + "[1]", item +"<2>");
    
    Observable.fromArray(new String[]{"aaaa","bbbb","cccc","dddd"})
    	.flatMap(getflatMap)
        .subscribe(
        	item -> datas.add(item),
            () -> adapter.notifyDataSetChanged()
        );
}

flatmap으로 구구단 만들어보기.

private void doGugudan(int dan)}
	Function<Integer, Observable<Integer>> gugudan = num -> Observable.range(1,9).map(row -> num + "*" +  row + "="+ num*row);
    
    Observable.just(dan)
    	.flatMap(gugudan)
        .subscribe( item -> datas.add(item),
        	() -> adapter.notifyDataSetChanged()
        );
}

Zip

  • 2개 이상의 Observable을 결합 할 때 사용한다.
  • 만약 한쪽의 Observable에서 처리가 안된다면 <직전값, 이전 값이 아닌> 진행중인 것이 모두 처리 될 때까지 발행을 기다렸다가 묶어주고 발행
  • Observable.zip(옵져버블1, 옵져버블2, (옵1의 아이템, 옵2의 아이템 -> 처리)).subscribe 형태
  • 2개의 옵져버블 아이템 갯수가 동일해야지
private void doZip(){
	Observable.zip(Observable("Jeong"),
    	Observable("jaeyun"),
        (item1, item2) -> "Last Name : "+ item1 +", First Name :"+item2)
        .subscribe(zipped ->
        	((TextView) findViewById(R.id.tv).setText(zipped))
        );
}
profile
developer

0개의 댓글