micronaut petstore сегмент кода от Java до Groovy

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

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

}

person V H    schedule 15.11.2018    source источник
comment
Я не уверен, в чем вопрос - вы хотите, чтобы мы переписали этот класс для вас?   -  person Iłya Bursov    schedule 15.11.2018
comment
Привет, llya Короче говоря, если выше можно преобразовать из java в groovy, это было бы здорово github.com/vahidhedayati/micronaut-java-groovy-comparison/blob/ - первая ссылка - это то, что я Я пытаюсь использовать этот код github.com/vahidhedayati/micronaut-java-groovy-comparison/blob/ - просто пытаюсь понять некоторые из более сложных операторов rxjava в java и как это сделать. под заводной   -  person V H    schedule 15.11.2018
comment
хорошо, спасибо за ваш вклад   -  person V H    schedule 15.11.2018
comment
Если у вас есть сбойный код, укажите в вопросе свою попытку и возможные ошибки. Тогда потенциальный ответ может сработать.   -  person cfrick    schedule 15.11.2018
comment
Спасибо @cfrick. Я добавил то, что делал вчера вечером, но сегодня начну заново и попробую начать заново. Было неловко рассказывать о том, что я сделал до сих пор, почему я не упомянул об этом   -  person V H    schedule 16.11.2018


Ответы (1)


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

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

Java: return key -> {

Отличный: return { key - >

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

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

Java: .map(ConvertibleValues::of)

Отличный: .map({ values -> ConvertibleValues.of(values) })

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

values.reduce({all, keyValue-> vs values.reduce(map, {all, keyValue ->

person James Kleeh    schedule 16.11.2018
comment
Спасибо, Джеймс. Попробую немного позже, когда у меня будет время. - person V H; 17.11.2018
comment
.map(ConvertibleValues::of) на самом деле соответствует .map(ConvertibleValues.&of) в Groovy - person injecteer; 20.11.2018