我见过BiConsumer,BiPredicate,BiFunction,但没有看到BiSupplier或类似的。我尝试了下面的代码,但得到了一个例外,它说:
“在BiSupplier中找到的多个非重写抽象方法”。
@FunctionalInterface
public interface BiSupplier<T, R> {
/**
* Gets a first.
*
* @return a first
*/
T getFirst();
/**
* Gets a second.
*
* @return a second
*/
R getSecond();
}能帮我个忙吗。
发布于 2021-03-09 14:59:26
Function (Predicate或Consumer)之间的概念与Supplier不同。
一个简单的解释表:
Function将1输入转换为1输出。BiFunction转换2个输入。因此,从理论上讲,可以有etc...Predicate和Function一样工作,但是输出总是boolean.Consumer消耗1输入而不返回任何东西(void)。BiConsumer消耗2个输入。所以理论上,可以有TriConsumer等.现在,Supplier。Supplier不将任何东西(0输入)转换为输出。请注意,上面的功能接口提供了一个输出(Function和Predicate)或无输出(Consumer)。
Supplier是从零开始创建的,正如您所知道的,不可能有多个返回类型。从理论上讲,BiSupplier意味着“从两个零开始创建一些东西”,这在Supplier<String> supplier = () -> "Hi";上下文中是没有意义的(然而,“一个什么都没有”:Supplier<String> supplier = () -> "Hi";)。
您可以将Supplier<T>理解为Function<Void, T> (在实践中不起作用,但原则相同)。现在,BiSupplier<T>将是BiFunction<Void, Void, T>,这是完全没有意义的。
发布于 2021-03-09 14:58:50
一个BiSupplier根本就没有意义。方法在Java中返回单个类型的值。
因此,您应该简单地创建一个包含这两个值的类并返回:
class MyValue<T, R> {
private final T first;
private final R second;
// constructors, getters.
}然后只使用Supplier<MyValue<T,R>>,而不是创建一个新的函数接口。
发布于 2022-08-10 05:19:28
您的代码是错误的,您用FunctionalInterface注释了接口,但是它有两个抽象方法。
https://stackoverflow.com/questions/66549177
复制相似问题