code: public static <T> String join(Iterator<T> iterator, CharSequence before, CharSequence separator, CharSequence after,
  			Functions.Function1<? super T, ? extends CharSequence> function) {
  		if (function == null)
  			throw new NullPointerException("function");
  		StringBuilder result = new StringBuilder();
  		boolean notEmpty = iterator.hasNext(); 
  		if (notEmpty && before != null)
  			result.append(before);
  		while (iterator.hasNext()) {
  			T next = iterator.next();
  			CharSequence elementToString = function.apply(next);
  			result.append(elementToString);
  			if (iterator.hasNext() && separator != null)
  				result.append(separator);
  		}
  		if (notEmpty && after != null)
  			result.append(after);
  		return result.toString();
  	}
docs: Returns the concatenated string representation of the elements in the given iterator. The {@code function} is
  used to compute the string for each element. The {@code separator} is used to between each pair of entries in the
  input. The string <code>null</code> is used if the function yields <code>null</code> as the string representation
  for an entry. The given iterator is left exhausted.
  
  @param iterator
  the iterator. May not be <code>null</code>.
  @param before
  prepends the resulting string if the iterator contains at least one element. May be <code>null</code> which is equivalent to passing an empty string.
  @param separator
  the separator. May be <code>null</code> which is equivalent to passing an empty string.
  @param after
  appended to the resulting string if the iterator contain at least one element. May be <code>null</code> which is equivalent to passing an empty string.
  @param function
  the function that is used to compute the string representation of a single element. May not be
  <code>null</code>.
  @return the string representation of the iterator's elements. Never <code>null</code>.