code: public F4<P1, P2, P3, P4, R> andThen(
                  final Func4<? super P1, ? super P2, ? super P3, ? super P4, ? extends R>... fs
          ) {
              if (0 == fs.length) {
                  return this;
              }
  
              final Func4<P1, P2, P3, P4, R> me = this;
              return new F4<P1, P2, P3, P4, R>() {
                  @Override
                  public R apply(P1 p1, P2 p2, P3 p3, P4 p4) {
                      R r = me.apply(p1, p2, p3, p4);
                      for (Func4<? super P1, ? super P2, ? super P3, ? super P4, ? extends R> f : fs) {
                          r = f.apply(p1, p2, p3, p4);
                      }
                      return r;
                  }
              };
          }
docs: Returns a composed function that applied, in sequence, this function and
  all functions specified one by one. If applying anyone of the functions
  throws an exception, it is relayed to the caller of the composed function.
  If an exception is thrown out, the following functions will not be applied.
  <p>When apply the composed function, the result of the last function
  is returned</p>
  
  @param fs
  a sequence of function to be applied after this function
  @return a composed function