code: public Consumer<T> andThen(final Consumer<? super T> after) {
          if (after == null) {
              throw new NullPointerException();
          }
          final Consumer<T> firstly = this;
          return new Consumer<T>() {
              @Override
              public void accept(T t) {
                  firstly.accept(t);
                  after.accept(t);
              }
          };
      }
docs: Returns a composed {@code Consumer} that performs, in sequence, this
  operation followed by the {@code after} operation. If performing either
  operation throws an exception, it is relayed to the caller of the
  composed operation.  If performing this operation throws an exception,
  the {@code after} operation will not be performed.
  
  @param after the operation to perform after this operation
  @return a composed {@code Consumer} that performs in sequence this
  operation followed by the {@code after} operation
  @throws NullPointerException if {@code after} is null