Tob*_*ias 5 java lambda java-8
public final Pattern PATTERN = Pattern.compile("<abc:c\\sabc:name=\"(\\S+)\"\\sabc:type=\"(\\S+)\">");
try (Stream<String> stream = Files.lines(template.getPath())) {
stream.filter(s -> PATTERN.matcher(s).find()).forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
该模式工作正常,但我如何捕获/获取我的组?目前我只得到弦乐.
如果选择应用模式只出现1次的线,可以映射你Stream<String>成Stream<Matcher>,过滤与该模式匹配的线和最后通过将它们存储在一个阵列中提取的组1和2.
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();
}
Run Code Online (Sandbox Code Playgroud)
如果模式出现多次,我们需要遍历Matcher直到find()返回false.在这种情况下,我们可以
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)));
Run Code Online (Sandbox Code Playgroud)
在Java 9中,可能有一种新方法Matcher.results()来检索Stream<MatchResult>结果.这里我们可以用它代替带有2个单独find和group操作.
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |