docs: 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();
  	}