我有以下方法:
public void countLetters() {
Flux.just("alpha", "bravo", "charlie")
.map(String::toUpperCase)
.flatMap(s -> Flux.fromArray(s.split("")))
.groupBy(String::toString)
.sort(Comparator.comparing(GroupedFlux::key))
.flatMap(group -> Mono.just(group.key()).and(group.count()))
.map(keyAndCount ->
keyAndCount.getT1() " => " keyAndCount.getT2())
.subscribe(System.out::println);
}
它給了我這些錯誤:
無法決議“Void”中的方法“getT1”
無法決議“Void”中的方法“getT2”
我不確定這意味著什么。是因為我的方法無效還是其他原因?
uj5u.com熱心網友回復:
代替
.flatMap(group -> Mono.just(group.key()).and(group.count()))
你需要
.map(group -> new Tuple2<>(group.key(), group.count()))
您的 flatMap 中的問題:
- 它根本不需要是平面地圖。您正在以“1 對 1”的方式映射您的回應,而無需任何進一步的反應流,因此
Mono.just不需要。 Mono.and加入 2Monos并將產生一個新的Mono<Void>,它是一個只完成的單聲道(當所有加入的單聲道完成時),這意味著它沒有結果(不發出任何值)。這意味著.mapand.flatMap在這個單聲道上將接受一個Voidas 引數(編譯時錯誤的主要原因)。不僅如此,它們永遠不會被呼叫,因為Mono<Void>不發出任何Void值,它們只是完成(類似于CompletableRxJava)。
例如,如果你有
Mono<File> downloadFile = ...;
Mono<Long> calculateNumber = ...;
你表演
Mono<Void> test = downloadFile.and(calculateNumber);
你會創建一個新的Mono,當兩個單聲道完成時完成,但扔掉兩個值!
所以:
test.map(v -> {
// v is type of "Void", and this map will never be called!
System.out.println("this will never be printed!");
return 0;
}).doFinally((signalType) -> {
System.out.println("this will be called!");
}).subscribe(
v -> System.out.println("wont be called, nothing is emitted!"),
err -> System.out.println("this might be called, if the stream emits an error"),
() -> System.out.println("this will be called, as its a completion handler!")
);
單聲道test將在兩個單聲道與and完整連接后終止/完成。
如果你真的想要一個flatMapwith Mono.just-ing 元組的值,你可以使用Mono.zip.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/352145.html
