如何从一个流中过滤掉不在另一串中的字符串?

时间:2019-02-26 10:55:34

标签: java java-stream

我有两个类似的字符串流:

Stream<String> thisWeekFile = Files.lines(thisWeekPath);
Stream<String> lastWeekFile = Files.lines(lastWeekPath);

与上周相比,本周文件可以具有相同的字符串,可以添加某些字符串,也可以删除某些字符串。现在,我只对上周文件中存在的字符串感兴趣,而对本周文件中的字符串不再感兴趣。我如何获得那些琴弦?我尝试过

lastWeekFile.filter(e->!thisWeekFile.anyMatch(e)); 

上面给出错误:String不能转换为谓词。

理想的是我想要类似的东西

lastWeekFile.filter(e->!thisWeekFile.contains(e));

3 个答案:

答案 0 :(得分:3)

您需要collect个流,然后可能删除lastWeekFile的条目(已更新存在):

Set<String> thisWeekFile = Files.lines(thisWeekPath).collect(Collectors.toSet());
List<String> lastWeekFile = Files.lines(lastWeekPath)).collect(Collectors.toList());
lastWeekFile.removeIf(e -> !thisWeekFile.contains(e));

答案 1 :(得分:1)

应该是

lastWeekFile.filter(e->Files.lines(thisWeekPath).noneMatch(o -> o.equals(e)))...; 

请注意,您不能一次使用同一流,因此必须多次生成本周的Stream

答案 2 :(得分:1)

使用Files.readLines()方法返回List而不是流,可以在没有流api的情况下完成:

List<String> thisWeekFile = Files.readAllLines(thisWeekPath);
List<String> lastWeekFile = Files.readAllLines(lastWeekPath);

lastWeekFile.removeAll(thisWeekFile);