Java 8 Stream - 如何返回用要查找的项目列表替换字符串内容

新手上路,请多包涵

我希望使用 java8 .stream() 或 .foreach() 替换下面的代码。但是我在这样做时遇到了麻烦。

它可能很容易,但我正在寻找思考斗争的实用方法:)

我可以迭代,没问题,但是返回修改后的字符串是由于可变性问题导致的问题。

有人有想法么 ?

 List<String> toRemove = Arrays.asList("1", "2", "3");
String text = "Hello 1 2 3";

for(String item : toRemove){
    text = text.replaceAll(item,EMPTY);
}

谢谢 !

原文由 SteveG 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 861
2 个回答

哇,你们喜欢用艰难的方式做事。这就是 filter() 和 collect() 的用途。

 List<String> toRemove = Arrays.asList("1", "2", "3");
String text = "Hello 1 2 3";

text = Pattern.compile("").splitAsStream(text)
    .filter(s -> !toRemove.contains(s))
    .collect(Collectors.joining());
System.out.println("\"" + text + "\"");

输出(与原始代码一样)

 "Hello   "

当然,如果您的搜索字符串长于一个字符,则前一种方法效果更好。但是,如果您有一个标记化的字符串,则拆分和连接会更容易。

 List<String> toRemove = Arrays.asList("12", "23", "34");
String text = "Hello 12 23 34 55";
String delimiter = " ";

text = Pattern.compile(delimiter).splitAsStream(text)
    .filter(s -> !toRemove.contains(s))
    .collect(Collectors.joining(delimiter));
System.out.println("\"" + text + "\"");

产出

"Hello 55"

原文由 Steve K 发布,翻译遵循 CC BY-SA 3.0 许可协议

由于您不能使用流来修改 text 变量,您必须将操作强制转换为一个 Function 您可以将其应用于 text 到 get the7-f01最后结果:

 List<String> toRemove = Arrays.asList("1", "2", "3");
String text = "Hello 1 2 3";
text=toRemove.stream()
             .map(toRem-> (Function<String,String>)s->s.replaceAll(toRem, ""))
             .reduce(Function.identity(), Function::andThen)
             .apply(text);

原文由 Holger 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题