Java 8流过滤器来过滤文件的特定部分
问题描述:
我有一个文件信息太多。像,Java 8流过滤器来过滤文件的特定部分
AA BB CC DD
WW FF SS FF
..
..
..
然后,
**** Input data ***
**
*
142.12123 Input taken for metrics
123.1222 Calculation point
.
.
.
**** Another Input ****
有没有一种方法可以选择只从
输入数据
直到
前“另一个输入”
我试图读取该文件作为流和过滤器,
Stream<String> output = Files
.lines(Paths.get("a.out"))
Map<Boolean, List<String>> partition = output
.collect(Collectors.partitioningBy(s -> s.contains("Input data")));
但过滤似乎过滤只有一行。我们可以过滤多行或设置从结束?
答
有一个java 9流api takeWhile
和dropWhile
,它将谓词作为参数。
takeWhile(s->s.contains("Another input"))
.dropWhile(s->s.contains("Input data"))
可以使用Java的和过滤器实现呈三角结果:
记住,它会在有序流只有工作,parallerism将打破这个代码。
请注意,我目前没有IDE,因此我不确定这一个会编译,但是当您修复错误时它应该可以工作。
Stream<String> output = Files
.lines(Paths.get("a.out"))
List<String> partition = output
.filter(new StartData())
.filter(new EndData())
.collect(toList);
class StartData implements Predicate<String> {
boolean matchingData = false;
boolean test(String input) {
if (input.contains("Input data")) {
matchingData = true;
}
return matchingData;
}
}
class EndData implements Predicate<String> {
boolean passThrough = true;
boolean test(String input) {
if (input.contains("Another Input")) {
passThrough = false;
}
return passThrough;
}
}
}
+0
谢谢,它的工作。 – ashK
您可以尝试一旦你找到'输入data'使用您设置为true的标志和虚假'另一个Input'后,该标志将在过滤器进行评估,以获得该块。但可能有更简单的解决方案。 – AxelH
你正在过滤谓词匹配一行。你如何期望你的代码神奇地工作? –
感谢您的评论,我对这个Streams和收藏家很新颖,只是想检查如何设置最终参数或简单的解决方案。 – ashK