데이터 변환 연산자
groupBy
- 하나의 Observable을 여러개의 새로운 GroupedByObservable로 만든다.
- 원본 Observable의 데이터를 그룹별로 묶는다기보다는 각각의 데이터들이 그룹에 해당하는 Key를 가지게 된다.
- GroupedByObservable은 getKey()를 통해 구분된 그룹을 알 수 있게 해준다.
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로 반환된다.
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로 반환된다.
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부를 공부하고 작성한 글입니다.
강의영상 링크