如何使用Java 8为每一行添加前缀?

时间:2016-02-29 19:19:12

标签: java lambda java-8

我有一个字符串,并希望为每一行添加一个前缀,从而产生一个新的字符串。

如何使用新的Java 8语法执行此操作?谢谢。

6 个答案:

答案 0 :(得分:5)

您可以使用正则表达式

static String appendPrefixToEachLine(String prefix, String s) {
    String ret = prefix + s.replaceAll("(\r\n|\n)", "$1" + prefix);
    return ret.substring(0, ret.length() - prefix.length());
}

正如@Holger所提到的,你可以在没有带

的捕获组的情况下做到这一点
return prefix+s.replaceAll("(?:\r\n?|\n)(?!\\z)", "$0"+Matcher.quoteReplacement(prefix));

这个正则表达式说,找到新线后的位置,但不是在结束之前。

答案 1 :(得分:2)

您要求使用Java 8解决方案,但没有必要为此使用任何Java 8功能。以下是我的表现:

static String prefixLines(String prefix, String input) {
    return input.replaceAll(".*\\R|.+\\z", Matcher.quoteReplacement(prefix) + "$0");
}

我认为匹配整行(包括部分最后一行)比仅匹配行分隔符更容易,如Peter Lawrey's answer。仍然,+1为此。另外,感谢Holger提及quoteReplacement,这很容易让人忘记。

请注意,我使用的\\R匹配任何Unicode换行符。但是,在BufferedReader.readLine()重要的情况下,这与{{1}}的行为不匹配。

答案 2 :(得分:1)

private String appendPrefixToEachLine(String prefix, String s) {
    StringBuilder stringBuilder = new StringBuilder();
    new BufferedReader(new StringReader(s)).lines()
            .map(line -> prefix + line + '\n')
            .forEach(stringBuilder::append);
    // Delete last added new line
    stringBuilder.deleteCharAt(stringBuilder.length() - 1);
    return stringBuilder.toString();
}

答案 3 :(得分:0)

您不应该在字符串上使用+运算符创建行。这会创建许多不必要的String中间实例。因为你有一个StringBuilder,你只需要附加一切:

private String appendPrefixToEachLine(String prefix, String s) {
    StringBuilder stringBuilder = new StringBuilder();
    new BufferedReader(new StringReader(s)).lines()
            .forEach(line -> stringBuilder.append(prefix).append(line).append('\n'));
    // Delete last added new line
    stringBuilder.deleteCharAt(stringBuilder.length() - 1);
    return stringBuilder.toString();

}

答案 4 :(得分:0)

private String appendPrefixToEachLine(String prefix, String s) {
    return new BufferedReader(new StringReader(s)).lines()
        .collect(Collectors.joining('\n'+prefix, prefix, ""));
}

说明:收集所有行并使用提供的分隔符将它们连接起来。

答案 5 :(得分:0)

如果您的字符串可以行分隔符的任意组合(\ n或\ r \ n等),则需要保留。另外,如果您不想为空行添加前缀,此解决方案可能会很有用。它使用新的Java 8 API,并且不使用RegEx:

public static String prefixEachLine(String text, String prefix) {
        StringBuilder result = new StringBuilder();
        Set<Character> endLineChars = Stream.of('\n', '\r').collect(Collectors.toSet());

        text.chars().forEach(ch -> {
            if (result.length() == 0 || (!endLineChars.contains((char) ch)
                    && endLineChars.contains(result.charAt(result.length() - 1)))) {
                result.append(prefix);
                result.append((char) ch);
            } else {
                result.append((char) ch);
            }
        });

        return result.toString();
    }