code: public static <T, R, C, V> Collector<T, ?, ImmutableTable<R, C, V>> toImmutableTable(
        Function<? super T, ? extends R> rowFunction,
        Function<? super T, ? extends C> columnFunction,
        Function<? super T, ? extends V> valueFunction) {
      checkNotNull(rowFunction, "rowFunction");
      checkNotNull(columnFunction, "columnFunction");
      checkNotNull(valueFunction, "valueFunction");
      return Collector.of(
          () -> new ImmutableTable.Builder<R, C, V>(),
          (builder, t) ->
              builder.put(rowFunction.apply(t), columnFunction.apply(t), valueFunction.apply(t)),
          (b1, b2) -> b1.combine(b2),
          b -> b.build());
    }
docs: Returns a {@code Collector} that accumulates elements into an {@code ImmutableTable}. Each
  input element is mapped to one cell in the returned table, with the rows, columns, and values
  generated by applying the specified functions.
  
  <p>The returned {@code Collector} will throw a {@code NullPointerException} at collection time
  if the row, column, or value functions return null on any input.
  
  @since 21.0