我试图在下面的代码中找到功能接口的替代方法。
它可以在我的本地计算机上运行,但是当我尝试在不支持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) + ")");
}
});
}
例如:
输入
-----------
输出
)أ(
)السلام(
هذا مجرد ) مثال ( .. طبعا
-----------
(أ)
(السلام)
هذا مجرد ( مثال ) .. طبعا
答案 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中运行它。