对于Java的早期版本,在Java 9`Matcher#replaceAll(Function)`中添加的替代方法是什么?

时间:2019-04-29 09:48:25

标签: java functional-interface

我试图在下面的代码中找到功能接口的替代方法。
它可以在我的本地计算机上运行,​​但是当我尝试在不支持Java 9的服务器上运行它时,它将无法编译。
关于不使用功能接口如何重新实现以下内容的任何想法?

public class Brackets {
    Pattern parentheses = Pattern.compile(
            "\\([\\p{InARABIC}\\s\\$]+\\)|\\([\\p{InBasic_Latin}\\s\\$]+\\)|\\)([\\p{InARABIC}\\s]+)\\(",
            Pattern.CASE_INSENSITIVE);
    @Override

    public String replace(String text) {
        String newText;

        Matcher parenthesesMatcher = parentheses.matcher(text);
            newText = parenthesesMatcher.replaceAll(match -> {
                if (parenthesesMatcher.group(1) == null) {
                    return Matcher.quoteReplacement(parenthesesMatcher.group());
                } else {
                    return Matcher.quoteReplacement("(" + match.group(1) + ")");
                }
            });

}

例如:
输入
-----------
输出

)أ(
)السلام(
هذا مجرد ) مثال ( .. طبعا
-----------
(أ)
(السلام)
هذا مجرد ( مثال ) .. طبعا

2 个答案:

答案 0 :(得分:3)

Matcher#replaceAll​(Function<MatchResult,​String> replacer)是Java 9中的简称,

StringBuffer sb = new StrinbBuffer(); 
while(matcher.find()){ 
    String replacement = /*replacement based on current match*/
    matcher.appendReplacement(sb, replacement); 
} 
matcher.appendTail(sb); 
String replacementResult = sb.toString();

因此,如您所见,上面的模板仅需要基于当前匹配来确定应替换的内容的方式,换句话说,将更改currenMatch-> replacement的功能。

因此,您的代码的“旧方法”看起来像这样:

@Override
public String replace(String text) {

    Matcher m = parentheses.matcher(text);
    StringBuffer sb = new StringBuffer();
    while(m.find()){
        if (m.group(1) == null) {
            m.appendReplacement(sb, Matcher.quoteReplacement(m.group()));
        } else {
            m.appendReplacement(sb, Matcher.quoteReplacement("(" + m.group(1) + ")"));
        }
    }
    m.appendTail(sb);

    return sb.toString();
}

答案 1 :(得分:2)

您的问题是此行上的replaceAll方法:

newText = parenthesesMatcher.replaceAll(match -> {

在Java 8中replaceAll只能接受String参数,而在Java 9中,此方法已被另一个也接受Function<MatchResult, String> replacer的版本重载。因此,您必须降级代码才能在Java 8中运行它。