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

Ste*_*veG 7 java foreach java-8 java-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);
}
Run Code Online (Sandbox Code Playgroud)

谢谢 !

Hol*_*ger 28

由于您无法使用流来修改text变量,因此必须将操作强制转换为Function可以应用于text获取最终结果的操作:

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);
Run Code Online (Sandbox Code Playgroud)

  • 很好,我以前从未见过Function.identity(),Function :: andThen.干得好. (2认同)

Ste*_*e K 13

哇,你们喜欢用艰难的方式做事.这就是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 + "\"");
Run Code Online (Sandbox Code Playgroud)

输出(正如原始代码所做的那样)

"Hello   "
Run Code Online (Sandbox Code Playgroud)

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

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 + "\"");
Run Code Online (Sandbox Code Playgroud)

输出

"Hello 55"
Run Code Online (Sandbox Code Playgroud)

  • 除了通过`String.split`创建一个包含所有元素的临时数组与使用`Stream` API完全相反.如果使用[`Pattern.compile(delimiter).splitAsStream(text)`](http://docs.oracle.com/javase/8/docs/api/java/util/regex/),这可能是一个很好的答案. Pattern.html#splitAsStream-java.lang.CharSequence-),仍然不是问题的真正含义,但没关系. (3认同)

小智 8

text = toRemove.stream()
               .reduce(text, (str, toRem) -> str.replaceAll(toRem, ""));
Run Code Online (Sandbox Code Playgroud)

会为你工作。

  • 你能否[编辑]解释为什么这段代码回答了这个问题?纯代码答案是 [不鼓励](http://meta.stackexchange.com/q/148272/274165),因为它们不教解决方案。 (4认同)