Java Streams 如何从嵌套事件处理器Map两级过滤后获取目标List
原有代码的问题
你之前的实现在外层Map按事件类型过滤后,直接将内层的Map<EventSource, List<EventHandler<? super Event>>>作为元素收集到列表中,既没有执行内层Map按事件源的二次过滤,也没有把内层的处理器列表打平为单个流,因此最终产出是List<Map<EventSource, List<EventHandler>>>,和预期的处理器列表类型不符。
正确实现思路
两级过滤的Stream流转逻辑应该是:
- 外层Map的entry转流 → 按eventType规则过滤
- 打平为内层Map的entry流 → 按eventSource规则过滤
- 打平为单个EventHandler流 → 收集为目标列表
参考实现代码
List<EventHandler<? super Event>> matchedHandlers = eventHandlers.entrySet().stream() // 第一级过滤:外层Map按事件类型规则匹配 .filter(entry -> entry.getKey() == event.eventType || event.eventType.isSubType(entry.getKey()) ) // 打平内层Map的entry流,跳过中间的内层Map流步骤 .flatMap(innerEntry -> innerEntry.getValue().entrySet().stream()) // 第二级过滤:内层Map按事件源规则匹配 .filter(innerEntry -> innerEntry.getKey().equals(event.eventSource)) // 打平所有匹配的处理器列表为单个流 .flatMap(List::stream) // 收集为目标列表 .collect(Collectors.toList());
小提示:如果
EventType不是单例枚举,建议将外层过滤里的==判断替换为equals,避免同值不同引用的类型对象漏匹配。
泛型说明
最终返回的列表泛型直接匹配你声明的EventHandler<? super Event>,不需要使用无意义的List<Object>;如果业务上已经确定处理器的具体类型,可以根据实际边界收窄通配符泛型。
内容的提问来源于stack exchange,提问作者JReynolds
相关产品推荐
相关产品推荐

