code: public static <K, V> Map<K, List<V>> groupBy(Iterable<? extends V> values,
  			Function1<? super V, ? extends K> computeKeys) {
  		return IteratorExtensions.groupBy(values.iterator(), computeKeys);
     }
docs: Returns a map for which the {@link Map#values} is a collection of lists, where the elements in the list will
  appear in the order as they appeared in the iterable. Each key is the product of invoking the supplied
  function {@code computeKeys} on its corresponding value. So a key of that map groups a list of values for
  which the function produced exactly that key.
  
  @param values
  the values to use when constructing the {@code Map}. May not be <code>null</code>.
  @param computeKeys
  the function used to produce the key for each value. May not be <code>null</code>.
  @return a map mapping the result of evaluating the function {@code keyFunction} on each value in the input
  iterable to that value. As there can be more than one value mapped by a key, the mapping result is is a
  list of values.
  @since 2.7