Java8 中的 BiSupplier

问题描述 投票:0回答:3

我见过

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();
}

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

java lambda java-8 functional-interface supplier
3个回答
13
投票

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>
,这确实没有任何意义。
    


2
投票
BiSupplier

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

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

class MyValue<T, R> { private final T first; private final R second; // constructors, getters. }

然后只需使用 
Supplier<MyValue<T,R>>

而不是创建新的功能接口。

    


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.