【问题标题】:Java 8 Stream filter to filter specific portion of a fileJava 8 Stream 过滤器过滤文件的特定部分
【发布时间】:2017-10-10 05:32:52
【问题描述】:

我有一个包含太多信息的文件。喜欢,

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")));

但过滤器似乎只过滤了一行。我们可以过滤多行或从头到尾设置吗?

【问题讨论】:

  • 您可以尝试使用在找到Input data 后设置为true 并在Another Input 之后设置为false 的标志,该标志将在过滤器中进行评估以获取该块。但可能有更简单的解决方案。
  • 你的过滤谓词匹配一行。您希望您的代码如何神奇地工作?
  • 感谢您的cmets,我对这个Streams和collectors很陌生,只想检查如何设置结束参数或简单的解决方案。
  • @AbhijitSarkar 看看我的回答,这样你就可以让它工作了

标签: java filter java-stream


【解决方案1】:

有一个 java 9 流 apitakeWhiledropWhile,它们以谓词作为参数。

takeWhile(s->s.contains("Another input"))
.dropWhile(s->s.contains("Input data"))

您可以使用 java 8 和过滤器实现类似的结果:

请记住,它只能在有序流中工作,并且并行会破坏此代码。

请注意,我目前没有 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;
  }
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多