Как отфильтровать строки из одного потока, которые не содержатся в другом потоке? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть два потока строк, например:

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

По сравнению с прошлой неделей в файле этой недели могут быть те же строки, некоторые строки добавлены или некоторые строки удалены.На данный момент меня интересуют только те строки, которые присутствовали в файле прошлых недель, но не больше в этом файле недель.Как мне получить эти строки?Я пробовал

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

Выше приведено сообщение об ошибке: Строка не может быть преобразована в предикат.

В идеале я хочу что-то вроде

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

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Это должно быть

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

Обратите внимание, что вы не можете использовать один и тот же поток более одного раза, поэтому вам придется генерировать Stream на этой неделе несколько раз.

0 голосов
/ 26 февраля 2019

Используя Files.readLines() метод, который возвращает List вместо потока, это можно сделать без stream api:

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

lastWeekFile.removeAll(thisWeekFile);
0 голосов
/ 26 февраля 2019

Вам необходимо 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...