gpt4 book ai didi

java - 为什么 Flux.zip 接受预定义函数而不接受匿名函数?

转载 作者:行者123 更新时间:2023-11-30 05:22:00 25 4
gpt4 key购买 nike

java中学习Flux(reactive-core)时,我遇到了以下关于Function的问题。

这是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);
}

当我尝试调用此方法时:



Flux<User> userFluxFromStringFlux(Flux<String> usernameFlux, Flux<String> firstnameFlux, Flux<String> lastnameFlux) {
// predefined function taking object[] and returns User
Function<Object[], User> function = array -> new User(array[0].toString(),array[1].toString(), array[2].toString());
// it is working without error
Flux.zip(function, usernameFlux, firstnameFlux, lastnameFlux);


// this is also working without error
Flux.zip(array -> {
return new User(array[0].toString(),array[1].toString(), array[2].toString());
}, usernameFlux, firstnameFlux, lastnameFlux);


// but this has error with array[0] "Array type expected; found: 'org.reactivestreams.subscriber<capture<? super java.lang.object>>'"
Flux.zip(array -> new User(array[0].toString(),array[1].toString(), array[2].toString()), usernameFlux, firstnameFlux, lastnameFlux);
return null;
}

第三种方式,使用匿名函数,但IDEA报错:

Array type expected; found: 'org.reactivestreams.subscriber>.

我想知道为什么预定义函数和具有显式返回的匿名函数可以工作,但匿名函数可以工作?

感谢您的帮助。

最佳答案

不是编译器专家,但我认为这与 java 编译器看到缩写形式 lambda 的歧义有关:是您传递内联 Publisher 的内容(因为它是一个函数式接口(interface)) 或函数

之所以会出现这种困惑,是因为简短形式没有明确的 return 语句:在 Publisher 选项的情况下,这意味着您创建一个 >User 立即被垃圾收集,但这不是编译器会禁止你做的事情。

因此 lambda 的目标类型被假定为 Publisher,因此 array 被推断为 Subscriber。但随后对其使用了数组索引运算符,这肯定是错误的。

另一方面,放入括号 { } 通过具有似乎在推理中使用的显式 返回 类型来消除歧义。对于编译器来说,您不能再代表 Publisher,因此使用下一个候选者 (Function)。

消除歧义的另一种方法是向编译器显示数组是...一个数组:

Flux.zip((Object[] array) -> new User(array[0].toString(),array[1].toString(), array[2].toString())
, usernameFlux, firstnameFlux, lastnameFlux);

关于java - 为什么 Flux.zip 接受预定义函数而不接受匿名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59409272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com