问题描述
我见过 BiConsumer
、BiPredicate
、BiFunction
但没有见过 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
从 nothing 中创建一些东西,如您所知,返回类型不可能超过一种。从理论上讲,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>>
而不是创建新的功能界面。