강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của greatyun
greatyun

câu hỏi đã được viết

RxJava dễ hiểu của Kevin, phần 1

Toán tử chuyển đổi (1)

groupby 질문있습니다!

Đã giải quyết

Viết

·

352

1

groupby 연산자를 사용하면.. 

db 쿼리 처럼 특정 컬럼기준으로 합계를 구한다던가.. 계산된 데이터를 확인하는 용도가 아닌거 같은데요..

groupby 를 사용해도 결국엔 filter 연산자를 사용해서 내가 원하는 데이터를 걸러내야 하는거 같은데요..

차라리 이러면 생성자로부터 통지받은 데이터를 애초부터 groupby 를 사용하지 않고 filter 연산자로만 걸러내는방식이랑 어떤점이 다를까요?

Reactive ProgrammingRxJavaReactive-Streams함수형-프로그래밍

Câu trả lời 5

1

Kevin님의 프로필 이미지
Kevin
Người chia sẻ kiến thức

아니에요. 부족하지만 저도 제가 아는걸 다른분들께 공유하면 보람도 되고, 더불어 저도 더 성장할 수 있고 또 아기 분유값도 벌 수 있어서 좋습니다. ^^;; 지상님도 개발자로써 멋진 인생 살아가시길 기원하겠습니다. 감사합니다!

0

greatyun님의 프로필 이미지
greatyun
Người đặt câu hỏi

존경합니다. 직장과 육아가 있는데 시간쪼개서 강의도 제작하시니 반성하게 되네요 ! 화이팅입니다! 

0

Kevin님의 프로필 이미지
Kevin
Người chia sẻ kiến thức

현재 Spring Reactive Web Applications 강의를 준비하고 있는 중입니다. 1부는 Reactor 위주이구요. 2부는 WebFlux를 이용한 Reactive Web Application 을 만들어보는것입니다. 직장이랑 육아때문에 강의 제작할 수 있는 작업 시간이 많이 나지않아서 강의 하나 올리는데 기간이 꽤 걸리네요. ^^; 제 개인적인 바램으로는 겨울이 가기 전에 오픈할 수 있었으면 하는 바램이에요. RxJava 강의를 오픈할때부터 Spring 베이스의 Reactive Application을 염두에 두고 있었으니까 죄송하지만 조금만 기다려주시면 감사드릴게요. 충분한 답변이 되셨다고 하니 다행입니다. ^^

0

greatyun님의 프로필 이미지
greatyun
Người đặt câu hỏi

아 자세한 답변 너무나도 감사합니다! 다시 작성해주신 코드를 보니 groupby 를 사용하는 목적을 제대로 이해했네요! 

혹시 추후 Spring 기반의 Mono Flux 를 다루는 API 서버 리액터 프로그래밍 강좌도 준비하실 계획없으세요?ㅎㅎ 

저도 그렇고 다들 스프링 리액터 강좌를 기다리시는 분들이 많을거 같네요! ^^

0

Kevin님의 프로필 이미지
Kevin
Người chia sẻ kiến thức

말씀하신대로 사용한 두번째 예제 코드에서 filter 사용은 불필요한게 맞는것 같습니다.

단순히 쉬운 예를 보여드리려고 한 의도가 있었는데 groupBy()를 설명하기에는 적절하지 않은 예인것 같네요.

groupBy()는 말씀하신대로 그룹별로 묶어서 어떤 처리를 할 수 있는 Operator가 맞습니다. 

그래서 groupBy() 사용에 좀 더 적절한 예제 코드를 추가로 올려두었습니다. github에 올려둔 소스 코드를 잠깐 설명 드리자면,

==== ObservableGroupByExample03 ===

/**
* 제조사를 그룹으로 묶어서 자동차 명을 출력하는 예제
*/
public class ObservableGroupByExample02 {
public static void main(String[] args) {
Observable<GroupedObservable<CarMaker, Car>> observable =
Observable.fromIterable(SampleData.carList)
.groupBy(Car::getCarMaker);

observable
.flatMapSingle(carGroup ->
carGroup.flatMap(car ->
Observable.just(car.getCarName()))
.toList()
)
.subscribe(System.out::println);

}
}

: 제조사별로 자동차 명만 출력하는 예제입니다. groupBy( ) 연산자는 Observable<GrouppedObserveble>을 반환을 하는데 이 GrouppedObservable을 flatMapSingle( ) 연산자를 이용해서 해당 그룹별로 통지되는 Car 객체 중에 CarName만 얻은 후,(CarName을 얻기 위해서 내부적으로 flatMap() 연산자를 한번 더 사용했음)  toList()를 통해 Single로 CarName이 담긴 list를 통지하는데요.  출력 결과는 아래와 같습니다.

=====================================

[티볼리, G4렉스턴]

[SM6, SM5]

[말리부, 트래버스, 트랙스]

[쏘렌토, 팰리세이드]

그리고 추가적으로 네번째 예제 코드를 하나 더 추가했습니다.

==== ObservableGroupByExample04 ====

/**
* 제조사 별로 그룹으로 묶은 후, 제조사 별 차량 가격의 합계를 구하는 예제
*/
public class ObservableGroupByExample03 {
public static void main(String[] args) {
Observable<GroupedObservable<CarMaker, Car>> observable =
Observable.fromIterable(SampleData.carList)
.groupBy(car -> car.getCarMaker());

observable
.flatMapSingle(carGroup ->
Single.just(carGroup.getKey())
.zipWith(
carGroup.flatMap(car ->
Observable.just(car.getCarPrice()))
.reduce((p1, p2)-> p1 + p2)
.toSingle()
, (key, sum) -> key + ": " + sum
)
)
.subscribe(System.out::println);
}
}

: 제조사 별 차량 가격의 합계를 구하는 예제인데요.  위의 ObservableGroupByExample03  코드와 거의 같은데 다른점은 제조사 별 차량 가격의 합계를 구하기 위해 reduce( ) 연산자를 한번 더 사용했다는 거구요.

차량 가격 합계 앞에 제조사를 표시해주기 위해서 zipWith( ) 연산자를 추가적으로 사용을 했습니다.

출력 결과는 아래와 같습니다.

================================

CHEVROLET: 91000000

HYUNDAE: 61000000

SSANGYOUNG: 66000000

SAMSUNG: 75000000

지적해주신 부분은 다른 수강생 분들도 아셔야 될테니 제가 시간될 때 코드 설명과 함께 새소식 공지로 다시 올리도록 할께요.

좋은 지적 해주셔서 감사합니다. 다른 의견 있으시면 언제든지 문의 주세요

감사합니다.

Hình ảnh hồ sơ của greatyun
greatyun

câu hỏi đã được viết

Đặt câu hỏi