java8 уменьшите с бесполезным сумматором - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно применить список регулярных выражений к строке, поэтому я подумал использовать java8 map lower:

List<SimpleEntry<String, String>> list = new ArrayList<>();

list.add(new SimpleEntry<>("\\s*\\bper\\s+.*$", ""));
list.add(new SimpleEntry<>("\\s*\\bda\\s+.*$", ""));
list.add(new SimpleEntry<>("\\s*\\bcon\\s+.*$", ""));

String s = "Tavolo da cucina";

String reduced = list.stream()
    .reduce(s, (v, entry) -> v.replaceAll(entry.getKey(), entry.getValue()) , (c, d) -> c);

На самом деле этот код может быть не очень красивым, но он работает.Я знаю, что это нельзя распараллелить, и для меня это нормально.

Теперь мой вопрос: есть ли шанс с Java8 (или более поздней версией) написать что-то более элегантное?Я имею в виду также избегать добавления бесполезной функции объединителя.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вдохновленный комментариями Александра и Хольгера, я написал это

String reduced = list.stream()
.map(entry-> 
    (Function<String, String>) v -> v.replaceAll(entry.getKey(), entry.getValue()))
.reduce(Function.identity(), Function::andThen)
.apply(s);

Это также уменьшает все записи в композиции функций.

0 голосов
/ 01 июня 2018

Вот еще один интересный подход: уменьшите все записи до композиции функции, затем примените эту составную функцию к исходному вводу:

String result = list.stream()
        .map(entry -> 
            (Function<String, String>) text -> 
                       text.replaceAll(entry.getKey(), entry.getValue()))
        //following op also be written as .reduce(Function::compose) (see comment by Eugene)
        .reduce((f1, f2) -> f1.andThen(f2)) //compose functions
        .map(func -> func.apply(s)) //this basically runs all `replaceAll`
        .get();

В результате вы получите ожидаемую строку.Хотя эта композиция функций не является интуитивно понятной, тем не менее, кажется, она соответствует идее, что ваш первоначальный список на самом деле является своего рода цепочкой «логики преобразования».

...