code: public static <T, E, M extends Multiset<E>> Collector<T, ?, M> toMultiset(
        java.util.function.Function<? super T, E> elementFunction,
        java.util.function.ToIntFunction<? super T> countFunction,
        java.util.function.Supplier<M> multisetSupplier) {
      checkNotNull(elementFunction);
      checkNotNull(countFunction);
      checkNotNull(multisetSupplier);
      return Collector.of(
          multisetSupplier,
          (ms, t) -> ms.add(elementFunction.apply(t), countFunction.applyAsInt(t)),
          (ms1, ms2) -> {
            ms1.addAll(ms2);
            return ms1;
          });
    }
docs: Returns a {@code Collector} that accumulates elements into a multiset created via the specified
  {@code Supplier}, whose elements are the result of applying {@code elementFunction} to the
  inputs, with counts equal to the result of applying {@code countFunction} to the inputs.
  Elements are added in encounter order.
  
  <p>If the mapped elements contain duplicates (according to {@link Object#equals}), the element
  will be added more than once, with the count summed over all appearances of the element.
  
  <p>Note that {@code stream.collect(toMultiset(function, e -> 1, supplier))} is equivalent to
  {@code stream.map(function).collect(Collectors.toCollection(supplier))}.
  
  @since 22.0