Фактический код здесь
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 .reduce, написанное на Groovy.
Блок неоднозначного кода находится вокруг всего этого сегмента 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)});
}