Posts RxJava - 데이터 변환 연산자 (2)
Post
Cancel

RxJava - 데이터 변환 연산자 (2)

데이터 변환 연산자

groupBy

  • 하나의 Observable을 여러개의 새로운 GroupedByObservable로 만든다.
  • 원본 Observable의 데이터를 그룹별로 묶는다기보다는 각각의 데이터들이 그룹에 해당하는 Key를 가지게 된다.
  • GroupedByObservable은 getKey()를 통해 구분된 그룹을 알 수 있게 해준다.

Group By

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
/**
 * Car 제조사 별로 그룹으로 묶어서 데이터를 통지하는 예제
 */
public class ObservableGroupByExample01 {
    public static void main(String[] args) {
        Observable<GroupedObservable<CarMaker, Car>> observable
                = Observable.fromIterable(SampleData.carList).groupBy(car -> car.getCarMaker());

        observable.subscribe(
             groupedObservable -> groupedObservable.subscribe(
                     car -> Logger.log(
                             LogType.ON_NEXT, "Group: " +
                                     groupedObservable.getKey() +
                                     "\t Car name: " + car.getCarName())
                     )
             );
    }
}
/*
onNext() | main | 15:39:53.496 | Group: CHEVROLET	 Car name: 말리부
onNext() | main | 15:39:53.505 | Group: HYUNDAE	 Car name: 쏘렌토
onNext() | main | 15:39:53.505 | Group: CHEVROLET	 Car name: 트래버스
onNext() | main | 15:39:53.505 | Group: HYUNDAE	 Car name: 팰리세이드
onNext() | main | 15:39:53.506 | Group: CHEVROLET	 Car name: 트랙스
onNext() | main | 15:39:53.506 | Group: SSANGYOUNG	 Car name: 티볼리
onNext() | main | 15:39:53.506 | Group: SAMSUNG	 Car name: SM6
onNext() | main | 15:39:53.506 | Group: SSANGYOUNG	 Car name: G4렉스턴
onNext() | main | 15:39:53.506 | Group: SAMSUNG	 Car name: SM5
*/
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
/**
 * Group으로 묶은 데이터들 중에서 filter를 이용해 필터링한 Group의 데이터만 출력하는 예제
 */
public class ObservableGroupByExample02 {
    public static void main(String[] args) {
        Observable<GroupedObservable<CarMaker, Car>> observable
                = Observable.fromIterable(SampleData.carList).groupBy(car -> car.getCarMaker());

        observable.subscribe(
             groupedObservable -> groupedObservable
                     .filter(car -> groupedObservable.getKey().equals(CarMaker.CHEVROLET))
                     .subscribe(
                     car -> Logger.log(
                             LogType.ON_NEXT, "Group: " +
                                     groupedObservable.getKey() +
                                     "\t Car name: " + car.getCarName())
                     )
             );
    }
}
/*
onNext() | main | 15:47:08.259 | Group: CHEVROLET	 Car name: 말리부
onNext() | main | 15:47:08.262 | Group: CHEVROLET	 Car name: 트래버스
onNext() | main | 15:47:08.262 | Group: CHEVROLET	 Car name: 트랙스
*/

toList

  • 통지 되는 데이터를 모두 List에 담아 통지한다.
  • 원본 Observable 에서 완료 통지를 받는 즉시 리스트를 통지한다.
  • 통지되는 데이터는 원본 데이터를 담은 리스트 하나이므로 Single로 반환된다.

toList

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 각각의 통지  데이터를 List로 변환해서 Single로 한번만 통지하는 예제
 */
public class ObservableToListExample01 {
    public static void main(String[] args) {
        Single<List<Integer>> single = Observable.just(1, 3, 5, 7, 9)
                .toList();

        single.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
    }
}
/*
onNext() | main | 16:00:58.553 | [1, 3, 5, 7, 9]
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * 각각의 통지될 Car 객체를 List로 변환해서 Single로 한번만 통지하는 예제
 */
public class ObservableToListExample02 {
    public static void main(String[] args) {
        Observable.fromIterable(SampleData.carList)
                .toList()
                .subscribe(carList -> Logger.log(LogType.ON_NEXT, carList));
    }
}
/*
onNext() | main | 16:03:45.394 | [[com.itvillage.common.Car@58c1670b, com.itvillage.common.Car@6b57696f, com.itvillage.common.Car@5bb21b69, com.itvillage.common.Car@6b9651f3, com.itvillage.common.Car@38bc8ab5, com.itvillage.common.Car@687080dc, com.itvillage.common.Car@23d2a7e8, com.itvillage.common.Car@7a9273a8, com.itvillage.common.Car@26a7b76d]]
*/

toMap

  • 통지 되는 데이터를 모두 Map에 담아 통지한다.
  • 원본 Observable에서 완료 통지를 받는 즉시 Map을 통지한다.
  • 이미 사용중인 key(키)를 또 생성하면 기존에 있던 key(키)와 value(값)를 덮어쓴다.
  • 통지되는 데이터는 원본 데이터를 담은 Map 하나이므로 Single로 반환된다.

toMap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * 통지된 데이터에서 map의 키를 생성한 후, 각각의 키별로 원본 통지 데이터를 매핑해서 Map으로 변환하는 예제
 */
public class ObservableToMapExample01 {
    public static void main(String[] args) {
        Single<Map<String, String>> single =
                Observable.just("a-Alpha", "b-Bravo", "c-Charlie", "e-Echo")
                        .toMap(data -> data.split("-")[0]); // 반환값은 Map의 key가 된다.

        single.subscribe(map -> Logger.log(LogType.ON_NEXT, map));
    }
}
/*
onNext() | main | 16:20:53.035 | {a=a-Alpha, b=b-Bravo, c=c-Charlie, e=e-Echo}
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * 원본 데이터를 변환한 값과 각각의 key를 매핑하여 Map으로 통지하는 예제
 */
public class ObservableToMapExample02 {
    public static void main(String[] args) {
        Single<Map<String, String>> single =
                Observable.just("a-Alpha", "b-Bravo", "c-Charlie", "e-Echo")
                        .toMap(
                                data -> data.split("-")[0],
                                data -> data.split("-")[1]
                        );

        single.subscribe(map -> Logger.log(LogType.ON_NEXT, map));
    }
}
/*
onNext() | main | 16:22:35.995 | {a=Alpha, b=Bravo, c=Charlie, e=Echo}
*/

기타 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * toMap을 이용하여 SampleData.carList의 car 객체들을 carName을 key로, carMaker를 value로 가지는 Map으로 출력하세요.
 */
public class QuizAnswerForChapter050401 {
    public static void main(String[] args) {
        Single<Map<String, CarMaker>> single = Observable.fromIterable(SampleData.carList)
                .toMap(
                        car -> car.getCarName(),
                        car -> car.getCarMaker()
                );
        single.subscribe(data -> Logger.log(LogType.ON_NEXT, data));
    }
}
/*
onNext() | main | 16:30:05.373 | {트래버스=CHEVROLET, 말리부=CHEVROLET, G4렉스턴=SSANGYOUNG, 쏘렌토=HYUNDAE, SM5=SAMSUNG, 팰리세이드=HYUNDAE, 트랙스=CHEVROLET, SM6=SAMSUNG, 티볼리=SSANGYOUNG}
*/

이 글은 inflearn에 있는 Kevin의 알기 쉬운 RxJava 1부를 공부하고 작성한 글입니다.
강의영상 링크

This post is licensed under CC BY 4.0 by the author.

RxJava - 데이터 변환 연산자 (1)

RxJava - 데이터 결합 연산자

Comments powered by Disqus.