繁体   English   中英

java8用无用的组合器减少

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM