@FunctionalInterface也实现了,然后呢?

问题描述 投票:1回答:2

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

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?或者是否需要实现其他功能才能使其与之一起使用?

谢谢!

java function generics functional-interface
2个回答
3
投票

功能接口仅允许指定一个未实现的功能。但是您可以指定已经具有如下实现的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));
  }
}

2
投票

你期望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函数。

© www.soinside.com 2019 - 2024. All rights reserved.