我有几行代码,我正在尝试将其转换为功能范例。代码是:
private String test(List<String> strings, String input) {
for (String s : strings) {
input = input.replace(s, ", ");
}
return input;
}
我需要制作一个指令链。它必须用给定的String输入中的coma IN替换给定列表中的所有字符串。我尝试用map方法做,但没有成功。我知道如果我在开始时将输入字符串添加到列表中然后调用map,我可以这样做,但列表是不可变的,所以我不能这样做。
答案 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("|"))
, ", "
);
}
主要区别在于它首先将所有搜索字符串组合成一个正则表达式,并一次性应用它们。根据输入字符串的大小,这可能比原始用例表现更好。
如果字符串列表是固定的,或者很少更改,则可以通过预编译连接的模式获得更快的速度。