Próbuję policzyć liczbę dopasowań wzorca regex za pomocą prostego rozwiązania opartego o lambdę/strumienie Javy 8. Na przykład dla tego wzoru/dopasowującego:Policz wyniki regex ze strumieniami
final Pattern pattern = Pattern.compile("\\d+");
final Matcher matcher = pattern.matcher("1,2,3,4");
Jest to metoda, która dzieli splitAsStream
tekst na dany wzór zamiast dopasowywania wzoru. Mimo że jest to elegancki i zachowuje niezmienność, to nie zawsze jest poprawne:
// 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();
Próbowałem również (AB) przy użyciu IntStream
. Problem polega na tym, że muszę zgadnąć, ile razy powinienem zadzwonić pod numer matcher.find()
zamiast do momentu, w którym zwróci false.
final long count = IntStream
.iterate(0, i -> matcher.find() ? 1 : 0)
.limit(100)
.sum();
jestem zaznajomiony z tradycyjnego rozwiązania while (matcher.find()) count++;
gdzie count
jest zmienny. Czy istnieje prosty sposób, aby to zrobić za pomocą Lambda/strumieni w języku Java 8?
Spróbuj spojrzeć na 'takeWhile': http://stackoverflow.com/a/20765715/1743880 – Tunaki
Dzielenie = pasującym!. Właśnie dlatego otrzymujesz liczby nieparzyste. Powinieneś zanegować swój Wzór, aby pobrać liczby i uzyskać to, co chcesz. – Flown
@Tunaki 'takeWhile' wygląda całkiem interesująco. Ale będzie on prawdopodobnie dostępny w Javie 9, a nie w Javie 8. –