在Java中,格式化后的字符串还是字符串吗?它仍然可以打印吗,还是只是一堆规则?

问题描述 投票:0回答:1

我正在看其他关于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[]{"#", "!"})
。这个字符串有什么意义吗?如果我只是初始化一个新字符串并将此值
"[ ]*([#!].*)?$"
赋给它,它会同样工作吗?

java java-stream string-formatting
1个回答
0
投票

它有助于分解代码中的步骤。在这个例子中,有很多东西被塞进了一个小空间。

x -> x.replaceAll( pattern, "" )
表达式正在对名为
replaceAll
的字符串调用
x
方法。如果您查看该方法定义,您将看到如何使用正则表达式
[ ]*([#!].*)?$
。是的,正则表达式作为字符串传入。

并且,是的,如果您硬编码相同的字符串并将其传递给

replaceAll
,它将产生相同的结果。

Arrays.stream()
调用使用最少的语法来迭代数组
commentSymbols
的元素。如果您查找
Collectors.joining()
方法调用,您会发现它连接了输入的所有字符串。因此,如果您输入 2 个字符串
"a"
"b"
,最终将生成一个字符串
"ab"

然后

Arrays.stream()
的返回值传递给
String.format
,其中第一个格式参数中的
%s
被替换为该值。

© www.soinside.com 2019 - 2024. All rights reserved.