将部分代码更改为功能范例

时间:2016-02-06 17:17:57

标签: java functional-programming java-8

我有几行代码,我正在尝试将其转换为功能范例。代码是:

private String test(List<String> strings, String input) {

    for (String s : strings) {
        input = input.replace(s, ", ");
    }

    return input;
}

我需要制作一个指令链。它必须用给定的String输入中的coma IN替换给定列表中的所有字符串。我尝试用map方法做,但没有成功。我知道如果我在开始时将输入字符串添加到列表中然后调用map,我可以这样做,但列表是不可变的,所以我不能这样做。

3 个答案:

答案 0 :(得分:2)

我相信你可以通过一个简单的简化来做到这一点:

strings.stream().reduce(input, (in, s) -> in.replace(s, ", "));

它接受输入,并用&#34;,&#34;替换第一个字符串的每个出现。然后它获取该结果,并将其与下一个字符串一起用作输入,并对列表中的每个项目重复。

正如ASCII code 0x72所指出的,此方法无法与parallelStream一起使用,因此如果您想进行并行化,它将无法正常工作。

答案 1 :(得分:1)

我能想到的唯一想法 - 这很尴尬 - 是

 strings.stream()
     .map(s -> (Function<String, String>) (x -> x.replace(s, ", ")))
     .reduce(Function.identity(), Function::andThen)
     .apply(input)

答案 2 :(得分:0)

以下几乎完全相同。

private String test(List<String> strings, String input) {
    return input.replaceAll(
            strings
                .stream()
                .map(Pattern::quote)
                .collect(Collectors.joining("|"))
            , ", "
    );
}

主要区别在于它首先将所有搜索字符串组合成一个正则表达式,并一次性应用它们。根据输入字符串的大小,这可能比原始用例表现更好。

如果字符串列表是固定的,或者很少更改,则可以通过预编译连接的模式获得更快的速度。