Что является альтернативой добавления в Java 9 `Matcher # replaceAll (Function)` для более ранних версий Java? - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь найти альтернативу функциональному интерфейсу, который используется в моем коде ниже.
Он работает на моей локальной машине, но когда я пытаюсь запустить его на моем сервере, который не поддерживает 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 ]

3 голосов
/ 29 апреля 2019

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();
}
2 голосов
/ 29 апреля 2019

Ваша проблема в методе replaceAll в этой строке:

newText = parenthesesMatcher.replaceAll(match -> {

В Java 8 replaceAll может принимать только аргумент String, тогда как в Java 9 этот метод был перегружен другой версией, которая также принимает Function<MatchResult, String> replacer. Поэтому вам придется понизить код, чтобы запустить его в Java 8.

...