実際のコードはこちら
private Function<String, Mono<? extends Offer>> keyToOffer(RedisReactiveCommands<String, String> commands) {
return key -> {
Flux<KeyValue<String, String>> values = commands.hmget(key, "price", "description");
Map<String, String> map = new HashMap<>(3);
return values.reduce(map, (all, keyValue) -> {
all.put(keyValue.getKey(), keyValue.getValue());
return all;
})
.map(ConvertibleValues::of)
.flatMap(entries -> {
String description = entries.get("description", String.class).orElseThrow(() -> new IllegalStateException("No description"));
BigDecimal price = entries.get("price", BigDecimal.class).orElseThrow(() -> new IllegalStateException("No price"));
Flowable<Pet> findPetFlowable = petClient.find(key).toFlowable();
return Mono.from(findPetFlowable).map(pet -> new Offer(pet, description, price));
});
};
}
上記をグルーヴィーに変換するためにさまざまな方法を試しましたが、これまでのところすべての試みはうまくいきませんでした。groovy に詳しい人が助けてくれるのだろうかと思った
コード自体が最初に Intelij のあいまいなコード ブロックを返し、次に完全に間違っているように見えるため、私の試みは投稿されませんでした。
private Function<String, Mono<? extends Orders>> keyToOrder(RedisReactiveCommands<String, String> commands) {
return { key -> {
Flux<KeyValue<String, String>> values = commands.hmget(key, "price", "description");
Map map = [:]
return values.reduce(map, (all, keyValue)= {all.put(keyValue.getKey(), keyValue.getValue());
return all
}).map({entries -> ConvertibleValues.of(entries)})
.flatMap({entries -> {
String description = entries.get("description", String.class).orElseThrow({ new IllegalStateException("No description")});
BigDecimal price = entries.get("price", BigDecimal.class).orElseThrow({new IllegalStateException("No price")});
Flowable<Item> findItemFlowable = itemClient.find(key).toFlowable();
return Mono.from(findItemFlowable).map({item -> new Orders(item, description, price)});
}});
}}
}
groovy に変換しようとするとき、最大の苦労は次のように見えました。
return values.reduce(map, (all, keyValue)= {all.put(keyValue.getKey(), keyValue.getValue());
return all
これは、元の Java コードの外観とはまったく異なり、本来の動作をするかどうかはまったくわかりません。私が抱えていた問題は、RXJAVA Flux .reduce で groovy で書かれたものを見つけることでした。
Ambiguous コード ブロックは、この flatMap セグメント全体の一番下にあります。
.flatMap({entries -> {
率直に言って恥ずかしかったので、この変更をチェックインしたり、投稿したりしませんでした。
私も遭遇しました: http://reactivex.io/documentation/operators/reduce.html#collapseRxGroovy
numbers.reduce({ a, b -> a+b }).
そして最終的に:
Map<String, String> map = new HashMap<>(3);
return values.reduce({all, keyValue->
all.put(keyValue.getKey(), keyValue.getValue());
return all
}).map({entries -> ConvertibleValues.of(entries)})
しかし、これも間違っているように見え、Java コードが行っていたことと実際には一致しません。
宣言されたマップは使用されていないため、コードをグルーヴィーとして受け入れるように Intelij を取得しましたが、Java コードが実際に行っていたことであるかどうかはよくわかりません。
private Function<String, Mono<? extends Orders>> keyToOrder(RedisReactiveCommands<String, String> commands) {
Flux<KeyValue<String, String>> values = commands.hmget(key, "price", "description");
Map<String, String> map = new HashMap<>(3);
values.reduce({all, keyValue->
all.put(keyValue.getKey(), keyValue.getValue());
return all
}).map({entries -> ConvertibleValues.of(entries)})
.flatMap({entries -> bindEntry(entries)});
return values.key
}
private Mono<Orders> bindEntry(entries) {
String description = entries.get("description", String.class).orElseThrow({ new IllegalStateException("No description")});
BigDecimal price = entries.get("price", BigDecimal.class).orElseThrow({new IllegalStateException("No price")});
Flowable<Item> findItemFlowable = itemClient.find(key).toFlowable();
return Mono.from(findItemFlowable).map({item -> new Orders(item, description, price)});
}