code: @SuppressWarnings({ "rawtypes", "unchecked" })
      public static <T, U> Collector<T, ?, Optional<U>> avg(Function<? super T, ? extends U> function) {
          return Collector.of(
              () -> (Sum<U>[]) new Sum[1],
              (s, v) -> {
                  if (s[0] == null)
                      s[0] = Sum.create(function.apply(v));
                  else
                      s[0].add(function.apply(v));
              },
              (s1, s2) -> {
                  s1[0].add(s2[0]);
                  return s1;
              },
              s -> s[0] == null ? Optional.empty() : Optional.of(s[0].avg())
          );
      }
docs: Get a {@link Collector} that calculates the <code>AVG()</code> for any
  type of {@link Number}.