Java8 中的 BiSupplier

问题描述

我见过 BiConsumerBiPredicateBiFunction 但没有见过 Bisupplier 或类似的。我尝试了下面的代码,但有一个异常说:

“在 Bisupplier 中发现的多个非覆盖抽象方法”。

@FunctionalInterface
public interface Bisupplier<T,R> {

    /**
     * Gets a first.
     *
     * @return a first
     */
    T getFirst();


    /**
     * Gets a second.
     *
     * @return a second
     */
    R getSecond();
}

有人可以帮我解决这个问题吗。

解决方法

FunctionPredicateConsumer)之间的概念与 Supplier 不同。

简单的解释表:

  • Function 将 1 个输入转换为 1 个输出。 BiFunction 转换 2 个输入。所以理论上,可以有 TriFunction 等...
  • Predicate 的工作方式与 Function 相同,但输出始终为 boolean
  • Consumer 消耗 1 个输入并且不返回任何内容 (void)。 BiConsumer 消耗 2 个输入。所以理论上,可以有 TriConsumer 等...

现在,SupplierSupplier 不会将任何内容(0 个输入)转换为输出。请注意,上面的功能接口提供 oneFunctionPredicate)或 noneConsumer)输出。

Suppliernothing 中创建一些东西,如您所知,返回类型不可能超过一种。从理论上讲,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>> 而不是创建新的功能界面。