使用 flatmapIterable 时避免耗时的逻辑
Avoiding time consuming logic when using flatmapIterable
我有一个任务是将一个单词拆分成字符,然后将每个字符转换为另一个单词。
我写了一些测试代码,使用toCharArray在flatMapIterable部分获取char数组,但是如果目标字符串更大一、我觉得这个方法比较费时,而且sync
我的问题是有没有更好的方法或替代方案以反应堆方式执行此操作并避免耗时?
final String s = "acebo";
Mono.just(s)
.log()
.flatMapIterable(str -> {
char[] chars = str.toCharArray();
List<String> result = new ArrayList<>();
for (char aChar : chars) {
result.add(String.valueOf(aChar));
}
return result;
})
.flatMap(this::retrieveSymbolLetter)
.subscribe(System.out::println);
private Mono<String> retrieveSymbolLetter(Object symbol) {
return Mono.defer(() -> {
String result;
switch (symbol.toString()) {
case "a":
result = "aspect";
break;
case "b":
result = "bad";
break;
case "c":
result = "context";
break;
case "d":
result = "dad";
break;
default:
result = "default";
break;
}
return Mono.just(result);
});
}
请考虑使用这样的方法:
Flux.fromStream(s.chars().mapToObj(str->(char)str).map(String::valueOf));
而不是代码的开头:
Mono.just(s)
.log()
.flatMapIterable ...
答案基于 Flux 的文档:
https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#fromStream-java.util.stream.Stream-
我不确定这是我们可以写的最佳答案:)
我认为创建 Flux 然后通过 flatMapIterable 将 Mono 转换为 Flux 更有效。
我有一个任务是将一个单词拆分成字符,然后将每个字符转换为另一个单词。
我写了一些测试代码,使用toCharArray在flatMapIterable部分获取char数组,但是如果目标字符串更大一、我觉得这个方法比较费时,而且sync
我的问题是有没有更好的方法或替代方案以反应堆方式执行此操作并避免耗时?
final String s = "acebo";
Mono.just(s)
.log()
.flatMapIterable(str -> {
char[] chars = str.toCharArray();
List<String> result = new ArrayList<>();
for (char aChar : chars) {
result.add(String.valueOf(aChar));
}
return result;
})
.flatMap(this::retrieveSymbolLetter)
.subscribe(System.out::println);
private Mono<String> retrieveSymbolLetter(Object symbol) {
return Mono.defer(() -> {
String result;
switch (symbol.toString()) {
case "a":
result = "aspect";
break;
case "b":
result = "bad";
break;
case "c":
result = "context";
break;
case "d":
result = "dad";
break;
default:
result = "default";
break;
}
return Mono.just(result);
});
}
请考虑使用这样的方法:
Flux.fromStream(s.chars().mapToObj(str->(char)str).map(String::valueOf));
而不是代码的开头:
Mono.just(s)
.log()
.flatMapIterable ...
答案基于 Flux 的文档:
https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#fromStream-java.util.stream.Stream- 我不确定这是我们可以写的最佳答案:) 我认为创建 Flux 然后通过 flatMapIterable 将 Mono 转换为 Flux 更有效。