0

实际代码在这里

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,但到目前为止所有的尝试都没有得到很好的结果。我想知道是否有更好的 groovy 可以提供帮助

我的尝试没有发布,因为代码本身首先在 Intelij 中返回Ambiguous 代码块,其次看起来完全错误。

 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 代码的外观完全不同,并且真的不确定它是否会按应有的方式运行。我遇到的问题是找到任何用 groovy 编写的关于 RXJAVA Flux .reduce 的东西。

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 接受代码作为 groovy 但不太确定它是否是 java 代码实际在做的事情,因为声明的 map 甚至没有使用:

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

}
4

1 回答 1

2

您面临的可能问题是因为 Groovy 不支持 Java 方法引用或 lambda。

第一行返回一个 lambda

爪哇:return key -> {

时髦的:return { key - >

那就是使用一个以键为参数的常规闭包。

其他使用方法引用的地方需要转换

爪哇:.map(ConvertibleValues::of)

时髦的:.map({ values -> ConvertibleValues.of(values) })

似乎您已经解决了大部分问题,但是您特别询问了未使用的地图。那是因为您根本没有将它传递给方法。

values.reduce({all, keyValue-> 对比 values.reduce(map, {all, keyValue ->

于 2018-11-16T21:39:12.713 回答