我正在看其他关于java实践的代码。这是他的代码:
import java.util.Arrays;
import java.util.stream.Collectors;
public class StripComments {
public static String stripComments(String text, String[] commentSymbols) {
String pattern = String.format(
"[ ]*([%s].*)?$",
Arrays.stream( commentSymbols ).collect( Collectors.joining() )
);
return Arrays.stream( text.split( "\n" ) )
.map( x -> x.replaceAll( pattern, "" ) )
.collect( Collectors.joining( "\n" ) );
}
}
所以在他的代码中,模式代表了 commentSymbols 中的任何内容,对吧?如果我决定在创建字符串后立即打印模式,该模式会是什么样子?如果pattern是一个可打印的字符串,为什么在后面的句子中我们可以用它来过滤掉我们要删除的句子?
抱歉我的语言问题,我的母语不是英语。
我使用了调试模式,它显示的模式看起来像这样
"[ ]*([#!].*)?$"
,而输入是 ("apples, pears # and bananas\ngrapes\nbananas !apples", new String[]{"#", "!"})
。这个字符串有什么意义吗?如果我只是初始化一个新字符串并将此值 "[ ]*([#!].*)?$"
赋给它,它会同样工作吗?
它有助于分解代码中的步骤。在这个例子中,有很多东西被塞进了一个小空间。
x -> x.replaceAll( pattern, "" )
表达式正在对名为 replaceAll
的字符串调用 x
方法。如果您查看该方法定义,您将看到如何使用正则表达式 [ ]*([#!].*)?$
。是的,正则表达式作为字符串传入。
并且,是的,如果您硬编码相同的字符串并将其传递给
replaceAll
,它将产生相同的结果。
Arrays.stream()
调用使用最少的语法来迭代数组commentSymbols
的元素。如果您查找 Collectors.joining()
方法调用,您会发现它连接了输入的所有字符串。因此,如果您输入 2 个字符串 "a"
和 "b"
,最终将生成一个字符串 "ab"
。
然后
Arrays.stream()
的返回值传递给 String.format
,其中第一个格式参数中的 %s
被替换为该值。