4

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

“在 BiSupplier 中找到多个非覆盖抽象方法”。

@FunctionalInterface
public interface BiSupplier<T, R> {

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


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

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

4

2 回答 2

8

FunctionPredicateConsumer)之间的概念不同Supplier

一个简单的解释表:

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

现在,Supplier. 什么都没有(0个Supplier输入)变成一个输出。请注意,上面的功能接口提供一个( Functionand Predicate) 或( Consumer) 输出。

Supplier从无到有,如您所知,不可能有多个返回类型。从理论上讲BiSupplier,这意味着像“从两个虚无中创建一些东西”,这在 Java 上下文中是没有意义的(但是,“一个虚无”可以:)Supplier<String> supplier = () -> "Hi";

你可以理解Supplier<T>Function<Void, T>(在实践中不起作用,但原理是一样的)。现在,BiSupplier<T>BiFunction<Void, Void, T>真的没有任何意义。

于 2021-03-09T14:59:26.497 回答
2

一个BiSupplier根本没有意义。方法在 Java 中返回单一类型的值。

因此,您应该简单地创建一个包含两个值的类并返回:

class MyValue<T, R> {
    private final T first;
    private final R second;

    // constructors, getters.
}

然后只是使用Supplier<MyValue<T,R>>而不是创建一个新的功能接口。

于 2021-03-09T14:58:50.690 回答