docs: @Override
    public <K, T> KVStreamlet<K, T> reduceByKey(SerializableFunction<R, K> keyExtractor,
                                                SerializableFunction<R, T> valueExtractor,
                                                SerializableBinaryOperator<T> reduceFn) {
      checkNotNull(keyExtractor, "keyExtractor cannot be null");
      checkNotNull(valueExtractor, "valueExtractor cannot be null");
      checkNotNull(reduceFn, "reduceFn cannot be null");
  
      ReduceByKeyStreamlet<R, K, T> retval =
          new ReduceByKeyStreamlet<>(this, keyExtractor, valueExtractor, reduceFn);
      addChild(retval);
      return new KVStreamletShadow<K, T>(retval);
    }