public static <V,T,R> Function1<V, R> compose(final Function1<? super T, ? extends R> after, final Function1<? super V, ? extends T> before) {
		if (after == null)
			throw new NullPointerException("after");
		if (before == null)
			throw new NullPointerException("before");
		return new Function1<V,R>() {
			@Override
			public R apply(V v) {
				return after.apply(before.apply(v));
			}
		};
	}
public static < V , T , R > Function1 < V , R > compose ( final Function1 < ? super T , ? extends R > after , final Function1 < ? super V , ? extends T > before ) { if ( after == null ) throw new NullPointerException ( "after" ) ; if ( before == null ) throw new NullPointerException ( "before" ) ; return new Function1 < V , R > ( ) { @ Override public R apply ( V v ) { return after . apply ( before . apply ( v ) ) ; } } ; }
Returns a composed function that first applies the {@code before}
function to its input, and then applies the {@code after} function to the result.
If evaluation of either function throws an exception, it is relayed to
the caller of the composed function.

@param <V> the type of input to the {@code before} function, and to the
composed function
@param <T> the type of output of the {@code before} function, and input to the
{@code after} function
@param <R> the type of output to the {@code after} function, and to the
composed function
@param after the function to apply after the before function is applied
@param before the function to apply before the after function is applied
@return a composed function that first applies the {@code before}
function and then applies the {@code after} function
@throws NullPointerException if {@code before} or {@code after} is <code>null</code>

@see #andThen(Functions.Function1, Functions.Function1)
@since 2.9