[英]java8 reduce with useless combiner
我需要将正则表达式列表应用于字符串,因此我想使用java8 map reduce:
List<SimpleEntry<String, String>> list = new ArrayList<>();
list.add(new SimpleEntry<>("\\s*\\bper\\s+.*$", ""));
list.add(new SimpleEntry<>("\\s*\\bda\\s+.*$", ""));
list.add(new SimpleEntry<>("\\s*\\bcon\\s+.*$", ""));
String s = "Tavolo da cucina";
String reduced = list.stream()
.reduce(s, (v, entry) -> v.replaceAll(entry.getKey(), entry.getValue()) , (c, d) -> c);
实际上,这段代码可能不是很漂亮,但是可以工作。 我知道这不能并行化,对我来说还可以。
现在我的问题是:Java8(或更高版本)是否有可能编写更精美的东西? 我的意思是也避免添加无用的合并器功能。
受Oleksandr的评论和Holger的启发,我写了这篇
String reduced = list.stream()
.map(entry->
(Function<String, String>) v -> v.replaceAll(entry.getKey(), entry.getValue()))
.reduce(Function.identity(), Function::andThen)
.apply(s);
这也将所有条目简化为功能组合。
这是另一种有趣的方法:将所有条目简化为一个函数组合,然后将该组合后的函数应用于原始输入:
String result = list.stream()
.map(entry ->
(Function<String, String>) text ->
text.replaceAll(entry.getKey(), entry.getValue()))
//following op also be written as .reduce(Function::compose) (see comment by Eugene)
.reduce((f1, f2) -> f1.andThen(f2)) //compose functions
.map(func -> func.apply(s)) //this basically runs all `replaceAll`
.get();
结果是您期望的字符串。 尽管此功能组合不直观,但似乎符合您的原始列表实际上是一种“转换逻辑”链的想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.