This code below works, but it would be nice if I don't need to map the key at the beginning.
@Bean
public Function<
KStream<ReviewGroup, ProductReview>, KStream<ReviewGroup, ProductReviewFeedCollection>>
aggregate() {
return reviews ->
reviews
.map((key, value) -> KeyValue.pair(key.toString(), value))
.groupByKey()
.aggregate(
ProductReviewFeedAggregate::new,
new ProductReviewFeedAggregator(),
Materialized.<String, ProductReviewFeedAggregate, KeyValueStore<Bytes, byte[]>>as(
"product-review-feed-aggregate")
.withKeySerde(new Serdes.StringSerde())
.withValueSerde(new ProductReviewFeedAggregateSerde()))
.toStream()
.map(new ProductReviewFeedCollectionMapper())
.peek((key, value) -> log.debug("Aggregation result: {} - {}", key, value));
}
So, how can I leave the key as ReviewGroup
and the aggregate part compiles?
@Bean
public Function<
KStream<ReviewGroup, ProductReview>, KStream<ReviewGroup, ProductReviewFeedCollection>>
aggregate() {
return reviews ->
reviews
.groupByKey()
.aggregate(
ProductReviewFeedAggregate::new,
new ProductReviewFeedAggregator(),
Materialized.<String, ProductReviewFeedAggregate, KeyValueStore<Bytes, byte[]>>as(
"product-review-feed-aggregate")
.withKeySerde(???)
.withValueSerde(new ProductReviewFeedAggregateSerde()))
.toStream()
.map(new ProductReviewFeedCollectionMapper())
.peek((key, value) -> log.debug("Aggregation result: {} - {}", key, value));
}