1

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));
}
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
Ben Keil
  • 1,050
  • 1
  • 10
  • 30

0 Answers0