@FunctionalInterface
public interface Consumer {
    void accept(T t);
    default Consumer andThen(Consumer after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t);
  };
    }
}

Функциональные интерфейсы или SAM (Single Abstract Method) — это новая концепция, представленная в Java 8, которая позволяет определять интерфейс, имеющий только один и только один абстрактный метод. Благодаря этому ограничению можно использовать лямбда-выражения, потому что во время выполнения , Java сможет автоматически определять сигнатуру метода, который заменяет лямбда, и все будет происходить автоматически. Нам не обязательно использовать аннотацию @FunctionalInterface, чтобы пометить интерфейс как функциональный интерфейс, аннотация @FunctionalInterface позволяет избежать случайного добавления абстрактных методов в функциональные интерфейсы. Однако интерфейс JAVA 8 также может содержать методы, известные по умолчанию (методы интерфейса, которые имеют реализацию) и статические методы (также имеют реализацию, соответствующую той же логике, что и статический метод, определенный в классе). Вот пример:

@FunctionalInterface
public interface Predicate {
    boolean test(T t);
    default Predicate and(Predicate other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }
    default Predicate negate() {
        return (t) -> !test(t);
    }
    default Predicate or(Predicate other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
    static  Predicate isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

Java 8 поставляется со многими предопределенными функциональными интерфейсами в пакете java.util.function, подробности которого доступны по следующему адресу.