如何在不使用 for 循环的情况下按字符串列表过滤 java 流

How filter java stream by a list of strings without using a for loop

我有一个 List<LogEntry>,我需要从列表中过滤掉不在 Level.SEVERE 上的所有日志。 此外,我还有一个需要过滤的白名单日志列表。 这些日志仅包含部分消息,因此我必须使用 contains() 来识别它们。

我的代码如下所示:

LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
List<LogEntry> logEntriesList = logEntries.getAll();

Stream<LogEntry> filtered =
    logEntriesList.stream()
                  .filter(log -> log.getLevel().equals(Level.SEVERE));
    
for (String whitelisted : whitelistedLogs) {
    filtered = filtered.filter(log -> !log.getMessage().contains(whitelisted));
}

有什么方法可以避免这个 for 循环并得到相同的结果吗?

如果列入白名单的日志是常量,而不是列表,您可以一次性从中创建一个正则表达式。这样你就可以:

filtered = filtered.filter(log -> !log.getMessage().matches(whitelisted_regex));

首先过滤日志级别为 SEVERE 的日志,然后过滤至少包含一条白名单消息的邮件:

logEntriesList.stream()
              .filter(log -> log.getLevel().equals(Level.SEVERE))
              .filter(log -> whitelistedLogs.stream().noneMatch(wl -> log.getMessage().contains(wl)))
              .collect(Collectors.toList());