如何在不使用 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());
我有一个 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());