Java 为什么Flux.zip接受预定义函数而不是匿名函数?
在Java 为什么Flux.zip接受预定义函数而不是匿名函数?,java,reactive-programming,project-reactor,flux,Java,Reactive Programming,Project Reactor,Flux,在java中学习Flux(反应核心)时,我遇到了以下关于函数的问题 这是Flux.zip()方法签名: public static <I, O> Flux<O> zip( final Function<? super Object[], ? extends O> combinator, Publisher<?extends I>... sources) { return zip(comb
java
中学习Flux(反应核心)时,我遇到了以下关于函数的问题
这是Flux.zip()
方法签名:
public static <I, O> Flux<O> zip(
final Function<? super Object[], ? extends O> combinator,
Publisher<?extends I>... sources) {
return zip(combinator, Queues.XS_BUFFER_SIZE, sources);
}
公共静态流量压缩(
final Function不是编译器专家,但我认为这与java编译器看到缩写lambda的歧义有关:您传递的是内联发布者(因为它是函数接口)还是函数
这种混淆是可能的,因为简短的表单没有明确的return
语句:在Publisher
选项的情况下,这意味着您创建了一个用户
,以便立即被垃圾收集,但编译器不会禁止您这样做
因此,lambda的目标类型被假定为发布者
,因此数组
被推断为订阅者
。但随后对其使用了数组索引运算符,这肯定是错误的
另一方面,将{}
放在括号中,通过在推理中使用显式的返回类型来消除歧义。对于编译器,您不能再表示发布者,因此使用下一个候选(函数
)
消除歧义的另一种方法是向编译器显示数组
是一个数组:
Flux.zip((Object[] array) -> new User(array[0].toString(),array[1].toString(), array[2].toString())
, usernameFlux, firstnameFlux, lastnameFlux);
Flux.zip((Object[] array) -> new User(array[0].toString(),array[1].toString(), array[2].toString())
, usernameFlux, firstnameFlux, lastnameFlux);