public static <A, B, C, D, E, F, G> Function<A, G> compose(Function<A, B> f1, Function<B, C> f2,
                                                               Function<C, D> f3, Function<D, E> f4,
                                                               Function<E, F> f5, Function<F, G> f6) {
        return requireNonNull(f1, "f1").andThen(requireNonNull(f2, "f2"))
                                       .andThen(requireNonNull(f3, "f3"))
                                       .andThen(requireNonNull(f4, "f4"))
                                       .andThen(requireNonNull(f5, "f5"))
                                       .andThen(requireNonNull(f6, "f6"));
    }
Returns a {@link Function} that composes the specified {@link Function}s with chained
{@link Function#andThen(Function)}. It is useful when you need to compose method handles, which is
impossible with {@link Function#andThen(Function)}:
<pre>{@code
Function<A, B> f = Functions.compose(TypeA::new, TypeB::new);
}</pre>
core/src/main/java/com/linecorp/armeria/common/util/Functions.java