我见过
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();
}
有人可以帮我解决这个问题吗?
Function
(Predicate
或Consumer
)的概念与Supplier
不同。
简单解释:
Function
将 1 个输入转换为 1 个输出。 BiFunction
转换 2 个输入。所以理论上,可以有TriFunction
等...Predicate
与 Function
的工作方式相同,但输出始终为 boolean
。Consumer
消耗 1 个输入并且不返回任何内容 (void
)。 BiConsumer
消耗 2 个输入。所以理论上,可以有TriConsumer
等...现在,
Supplier
。 Supplier
不会将任何内容(0 个输入)转换为输出。请注意,上面的函数接口提供 one(Function
和 Predicate
)或 none(Consumer
)输出。
Supplier
从无中创造出一些东西;如您所知,不可能有超过一种返回类型。从理论上讲,BiSupplier
意味着类似“从两无创建一些东西”,这在Java上下文中没有任何意义(但是,“一无所有”确实是:
Supplier<String> supplier = () -> "Hi";
)。你可以将Supplier<T>
理解为
Function<Void, T>
(实际中不起作用,但原理是一样的)。现在,BiSupplier<T>
将是BiFunction<Void, Void, T>
,这确实没有任何意义。BiSupplier
根本没有意义。 Java 中的方法返回单一类型的值。
因此,您应该简单地创建一个包含两个值的类并返回该值:class MyValue<T, R> {
private final T first;
private final R second;
// constructors, getters.
}
然后只需使用
Supplier<MyValue<T,R>>
而不是创建新的功能接口。