docs: @Override
    public <K, S, T> KVStreamlet<KeyedWindow<K>, T>
          join(Streamlet<S> otherStreamlet, SerializableFunction<R, K> thisKeyExtractor,
               SerializableFunction<S, K> otherKeyExtractor, WindowConfig windowCfg,
               SerializableBiFunction<R, S, ? extends T> joinFunction) {
      checkNotNull(otherStreamlet, "otherStreamlet cannot be null");
      checkNotNull(thisKeyExtractor, "thisKeyExtractor cannot be null");
      checkNotNull(otherKeyExtractor, "otherKeyExtractor cannot be null");
      checkNotNull(windowCfg, "windowCfg cannot be null");
      checkNotNull(joinFunction, "joinFunction cannot be null");
  
      return join(otherStreamlet, thisKeyExtractor, otherKeyExtractor,
          windowCfg, JoinType.INNER, joinFunction);
    }