code: public final <K> ImmutableListMultimap<K, E> index(Function<? super E, K> keyFunction) {
      return Multimaps.index(iterable, keyFunction);
    }
docs: Creates an index {@code ImmutableListMultimap} that contains the results of applying a
  specified function to each item in this {@code FluentIterable} of values. Each element of this
  iterable will be stored as a value in the resulting multimap, yielding a multimap with the same
  size as this iterable. The key used to store that value in the multimap will be the result of
  calling the function on that value. The resulting multimap is created as an immutable snapshot.
  In the returned multimap, keys appear in the order they are first encountered, and the values
  corresponding to each key appear in the same order as they are encountered.
  
  @param keyFunction the function used to produce the key for each value
  @throws NullPointerException if any of the following cases is true:
  <ul>
  <li>{@code keyFunction} is null
  <li>An element in this fluent iterable is null
  <li>{@code keyFunction} returns {@code null} for any element of this iterable
  </ul>
  @since 14.0