micronaut petstore кодовый сегмент от java до заводного - PullRequest
0 голосов
/ 15 ноября 2018

Фактический код здесь

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

}

1 Ответ

0 голосов
/ 17 ноября 2018

Вероятная проблема, с которой вы сталкиваетесь, заключается в том, что Groovy не поддерживает ссылки на методы Java или лямбда-выражения.

Первая строка возвращает лямбду

Java: return key -> {

Groovy: return { key - >

То есть использование Groovy замыкания с ключом в качестве аргумента.

Другие места, в которых используются ссылки на методы, необходимо преобразовать

Java: .map(ConvertibleValues::of)

Groovy: .map({ values -> ConvertibleValues.of(values) })

Похоже, у вас большая часть сработана, однако вы специально спросили о том, что карта не используется.Это потому, что вы просто не передаете его методу.

values.reduce({all, keyValue-> против values.reduce(map, {all, keyValue ->

...