Se il motivo che si sta applicando appare solo una volta per una linea, è possibile mappare lo Stream<String>
in un Stream<Matcher>
, filtrare le linee che corrispondono al modello ed infine estrarre il gruppo 1 e 2 memorizzandole in un array.
try (Stream<String> stream = Files.lines(Paths.get(""))) {
stream.map(PATTERN::matcher)
.filter(Matcher::find)
.map(m -> new String[] { m.group(1), m.group(2) })
.forEach(a -> System.out.println(Arrays.toString(a)));
} catch (IOException e) {
e.printStackTrace();
}
Se il modello appare più di una volta, avremmo bisogno di un loop all'interno di Matcher fino find()
rendimenti false
. In questo caso, potremmo avere
try (Stream<String> stream = Files.lines(Paths.get(""))) {
stream.map(PATTERN::matcher)
.flatMap(m -> {
List<String[]> list = new ArrayList<>();
while (m.find()) {
list.add(new String[] { m.group(1), m.group(2) });
}
return list.stream();
})
.forEach(a -> System.out.println(Arrays.toString(a)));
In Java 9, ci può essere un nuovo metodo per recuperare un Matcher.results()
Stream<MatchResult>
dei risultati. Potremmo usarlo qui invece di avere 2 operazioni separate find
e group
.
Può questo modello apparire più di 1 volta in una riga? – Tunaki
Non lo so esatcly ma io cosa - sì;) – Tobias
'.filter (s -> PATTERN.matcher (s) .find())' è equivalente a '.filter (PATTERN.asPredicate())' ... – Holger