Фактический код здесь
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)});
}});
}}
}
При попытке перейти в классный вид, самая большая борьба была вокруг:
return values.reduce(map, (all, keyValue)= {all.put(keyValue.getKey(), keyValue.getValue());
return all
Это не похоже на то, как выглядел исходный код Java, и действительно неуверенно, будет ли он вести себя так, как должен. Проблема, с которой я столкнулся, заключалась в том, чтобы найти что-нибудь похожее на RXJAVA Flux. Редукция написана в отличном виде.
Блок кодов неоднозначности находится вокруг всего этого сегмента 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)});
}