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)
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)
小智 8
text = toRemove.stream()
.reduce(text, (str, toRem) -> str.replaceAll(toRem, ""));
Run Code Online (Sandbox Code Playgroud)
会为你工作。
| 归档时间: |
|
| 查看次数: |
41685 次 |
| 最近记录: |