code: public static <T, K extends Enum<K>, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableEnumMap(
        java.util.function.Function<? super T, ? extends K> keyFunction,
        java.util.function.Function<? super T, ? extends V> valueFunction,
        BinaryOperator<V> mergeFunction) {
      checkNotNull(keyFunction);
      checkNotNull(valueFunction);
      checkNotNull(mergeFunction);
      // not UNORDERED because we don't know if mergeFunction is commutative
      return Collector.of(
          () -> new Accumulator<K, V>(mergeFunction),
          (accum, t) -> {
            K key = checkNotNull(keyFunction.apply(t), "Null key for input %s", t);
            V newValue = checkNotNull(valueFunction.apply(t), "Null value for input %s", t);
            accum.put(key, newValue);
          },
          Accumulator::combine,
          Accumulator::toImmutableMap);
    }
docs: Returns a {@link Collector} that accumulates elements into an {@code ImmutableMap} whose keys
  and values are the result of applying the provided mapping functions to the input elements. The
  resulting implementation is specialized for enum key types. The returned map and its views will
  iterate over keys in their enum definition order, not encounter order.
  
  <p>If the mapped keys contain duplicates, the values are merged using the specified merging
  function.
  
  @since 21.0