Usando java.util.regex a subseries extracto Me encuentro implementar el mismo patrón de código de trabajo en torno a las llamadas:
Pattern p = Pattern.compile(pattern); // can be static final
Matcher m = p.matcher(input);
if (m.find()) { // or m.matches()
foo(m.group(x));
} else {
...
}
¿Hay una extensión funcional o Biblioteca Popular (guayaba / Apache Commons) que evita la variable local innecesaria y propenso a errores feos, como:
Pattern p = Pattern.compile(pattern); // can be static final
p.matchedGroup(input, x) // return Optional<String>
.map(group -> foo(group))
.orElse(...);
y también una corriente de coincidencia resultados como:
Pattern p = Pattern.compile(pattern);
p.findMatches(input)
.map((MatchResult mr) -> {
mr.groupsIfPresent(x).map(g -> foo(g)).orElse(...)
})
.findFirst();
Parece que la única adición funcional en Java8 era .splitAsStream()
pero eso sólo ayuda cuando se trata de dividir en torno partidos.
A continuación sólo está disponible de java-9
Probablemente se esté buscando Matcher::results
lo que produce unaStream<MatchResult>
Se puede utilizar de la siguiente manera, por ejemplo,
p.matcher(input)
.results()
.map(MatchResult::group)
.findAny()
.orElse(null);
Una adición añadida por Holger y que está interesante lo que sería, al leer una File
y en busca de un patrón a utilizar directamente Scanner::findAll
para evitar cargar todo el archivo en la memoria usandoFile::lines