Перебрать регулярное выражение в vavr

Каков идиоматический способ перебора совпадений, возвращаемых регулярным выражением в java.

Обычно способ Java следующий (см. Как перебирать выражение регулярного выражения)

Pattern p = Pattern.compile("(\\w+)=(\\w+);");
Matcher m = p.matcher(line);
while (m.find()) {
    map.put(m.group(1), m.group(2));
}

Помимо возможной ошибки вызова .group перед .find, это императивно и поэтому не компонуется. Это означает, что вам нужно создать промежуточные структуры для хранения данных с помощью побочных эффектов.

Как использовать регулярное выражение, используя возможности итераторов/коллекций vavr?


person raisercostin    schedule 19.05.2020    source источник
comment
Тот факт, что вы отвечаете на свой собственный вопрос, не означает, что ваш вопрос может быть расплывчатым :) Не могли бы вы попытаться сделать свой вопрос более ясным?   -  person Federico klez Culloca    schedule 19.05.2020
comment
Я постараюсь улучшить его.   -  person raisercostin    schedule 19.05.2020


Ответы (1)


Используйте этот простой лайнер

  //given
  Pattern pattern = Pattern.compile("(\\w+)=(\\w+);");
  String line = "name1=gil;name2=orit;";

  Iterator<Matcher> all = 
    Iterator
      .continually(pattern.matcher(line))
      .takeWhile(matcher -> matcher.find());

  //use it like
  io.vavr.collection.Map<String,String> map = 
    all.toMap(m->m.group(1),m->m.group(2));
person raisercostin    schedule 19.05.2020