如何解决Java8 中的 BiSupplier
我见过 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
从 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>>
而不是创建新的功能界面。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。