Java如何用更优雅的写法替代移除字符串中数组匹配元素的for循环
方案1:用Stream reduce替代for循环
直接用流的归约操作就能替代循环迭代的逻辑,而且可以删掉冗余的anyMatch提前判断:如果数组里没有匹配的元素,替换操作不会改变原字符串,不需要额外多遍历一次数组做存在性校验。
代码实现:
import java.util.Arrays; private String removeElementsFromString(String str, String[] elements) { return Arrays.stream(elements) // 迭代替换每个关键词,初始值为原始字符串 .reduce(str, (currentStr, item) -> currentStr.replace(item, ""), (a, b) -> a); }
这里第三个参数是并行流下的合并器,串行场景下不会触发,直接返回任意值即可。
方案2:正则一次性替换(效率更高)
如果要移除的关键词数量较多,多次调用replace需要反复扫描字符串,性能较差。可以把所有关键词拼成正则表达式,只需要一次替换就能完成所有匹配子串的移除:
import java.util.Arrays; import java.util.regex.Pattern; import java.util.stream.Collectors; private String removeElementsFromString(String str, String[] elements) { String removeRegex = Arrays.stream(elements) // 转义关键词中的正则特殊字符,保证纯文本匹配 .map(Pattern::quote) .collect(Collectors.joining("|")); return str.replaceAll(removeRegex, ""); }
如果关键词之间存在包含关系(比如同时有cat和caterpillar),需要优先移除更长的关键词的话,可以在拼接正则前先按字符串长度倒序排序:
String removeRegex = Arrays.stream(elements) .sorted((s1, s2) -> Integer.compare(s2.length(), s1.length())) .map(Pattern::quote) .collect(Collectors.joining("|"));
内容的提问来源于stack exchange,提问作者AL̲̳I
相关产品推荐
相关产品推荐

