code: public static <T, K extends Enum<K>, A, D> Collector<T, ?, EnumMap<K, D>> groupingByEnum(Class<K> enumClass,
              Function<? super T, K> classifier, Collector<? super T, A, D> downstream) {
          return groupingBy(classifier, EnumSet.allOf(enumClass), () -> new EnumMap<>(enumClass), downstream);
      }
docs: Returns a {@code Collector} implementing a cascaded "group by" operation
  on input elements of type {@code T}, for classification function which
  maps input elements to the enum values. The downstream reduction for
  repeating keys is performed using the specified downstream
  {@code Collector}.
  
  <p>
  Unlike the {@link Collectors#groupingBy(Function, Collector)} collector
  this collector produces an {@link EnumMap} which contains all possible
  keys including keys which were never returned by the classification
  function. These keys are mapped to the default collector value which is
  equivalent to collecting an empty stream with the same collector.
  
  <p>
  This method returns a
  <a href="package-summary.html#ShortCircuitReduction">short-circuiting
  collector</a> if the downstream collector is short-circuiting. The
  collection might stop when for every possible enum key the downstream
  collection is known to be finished.
  
  @param <T> the type of the input elements
  @param <K> the type of the enum values returned by the classifier
  @param <A> the intermediate accumulation type of the downstream collector
  @param <D> the result type of the downstream reduction
  @param enumClass the class of enum values returned by the classifier
  @param classifier a classifier function mapping input elements to enum
  values
  @param downstream a {@code Collector} implementing the downstream
  reduction
  @return a {@code Collector} implementing the cascaded group-by operation
  @see Collectors#groupingBy(Function, Collector)
  @see #groupingBy(Function, Set, Supplier, Collector)
  @since 0.3.7