@FunctionalInterface 也实现了andThen?

@FunctionalInterface that also implements andThen?

我正在尝试创建一个可以抛出自定义异常的功能接口,我想出的是。

public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

@FunctionalInterface
public interface ThrowingFunction<T, R> {
  R apply(T t) throws MyException;
}

这非常适合使用 apply 函数,但问题是我还想使用 Java 函数的 andThen 功能。当我尝试做类似的事情时。

ThrowingFunction<Integer, Integer> times2WithException = (num) -> {
    if(num == null) {
       throw new MyException("Cannot multiply null by 2");
    }
    return num * 2;
};
times2WithException.andThen(times2WithException).apply(4);

我收到错误

Cannot find symbol: method andThen(ThrowingFunction<Integer, Integer>)

有什么我应该使用而不是 FunctionalInterface 的东西吗?还是我需要实现另一个功能才能使其与 andThen 一起使用?

谢谢!

您希望 andThen 方法来自哪里?你没有在任何地方定义它!

@FunctionalInterface
interface ThrowingFunction<T, R> {
    R apply(T t) throws MyException;

    default <V> ThrowingFunction<T, V> andThen(ThrowingFunction<R, V> after) {
        return (T t) -> after.apply(apply(t));
    }
}

在这里,您可以利用接口中的 default 方法来创建 andThen 函数。

函数式接口只允许指定一个未实现的函数。但是您可以指定 default 已经具有如下实现的函数:

@FunctionalInterface
public interface ThrowingFunction<T, R> {
  R apply(T t) throws MyException;

  default <U> ThrowingFunction<T, U> andThen(ThrowingFunction<R, U> follow) {
    Objects.requireNonNull(follow); // Fail fast
    return t -> follow.apply(this.apply(t));
  }
}