我正在发现 Java 8,尤其是Stream的使用,它看起来非常强大。不过,我在表达查询时遇到了问题。
我有一个要分析的事件对象列表。我想在这个列表中找出一些不好的模式(事件序列),应该删除。
基本上,一个事件对象有 3 个字段:
- Element eventSource(Element 超类的对象,例如 VirtualMachine),
- String eventName(事件类的类型,例如“VMHighCpu”或“VMLowCpu”),
- 字符串 eventMetric(涉及的指标,例如“cpu”)。
如果我有 2 个与相同源和相同指标相关的事件,但它们是相反的(例如,一个是“VMHighCpu”类型,另一个是“VMLowCpu”类型),我想从我的列表中删除这两个事件。
我尝试了几件事都不成功...
// Simple query
Map<Element, List<EventToAnalyze>> bySource = (Map) eventsToPurge.stream().collect(Collectors.groupingBy(EventToAnalyze::getSource));
// Another attempt
Map<Element, List<EventToAnalyze>> bySourceWithFilter = (Map) eventsToPurge.stream().filter(e -> e.getEventName().contains("Low")).collect(Collectors.groupingBy(EventToAnalyze::getSource));
// Last attempt
Map<Element, List<EventToAnalyze>> bySourceByMetric = (Map) eventsToPurge.stream().collect(Collectors.groupingBy(
EventToAnalyze::getSource, Collectors.groupingBy(
EventToAnalyze::getMetricName, Collectors.groupingBy(
EventToAnalyze::getEventName))));
希望我的解释清楚。