Я пытаюсь подсчитать количество совпадений шаблона регулярного выражения с помощью простого решения на основе Java 8 lambdas/streams. Например, для этой картины/согласовани:Соответствует регулярному выражению с потоками
final Pattern pattern = Pattern.compile("\\d+");
final Matcher matcher = pattern.matcher("1,2,3,4");
Существует метод splitAsStream
который разделяет текст на данном шаблоне вместо сопоставления с шаблоном. Несмотря на то, что это элегантный и сохраняет неизменность, это не всегда верно:
// count is 4, correct
final long count = pattern.splitAsStream("1,2,3,4").count();
// count is 0, wrong
final long count = pattern.splitAsStream("1").count();
Я также попытался (AB) с помощью IntStream
. Проблема в том, что я должен угадать, сколько раз я должен называть matcher.find()
вместо того, чтобы он возвращал false.
final long count = IntStream
.iterate(0, i -> matcher.find() ? 1 : 0)
.limit(100)
.sum();
Я знаком с традиционным решением while (matcher.find()) count++;
count
где изменчиво. Есть ли простой способ сделать это с помощью Java 8 lambdas/streams?
Попробуйте посмотреть в 'takeWhile': http://stackoverflow.com/a/20765715/1743880 – Tunaki
Расщепление = согласующего!. Вот почему вы получаете нечетные числа. Вы должны отменить свой шаблон, чтобы получить номера и получить то, что вы хотите. – Flown
@ Tunaki 'takeWhile' выглядит довольно интересно. Но он будет доступен в Java 9, по-видимому, а не Java 8. –