You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 14:36:07