有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java streams从map of maps获取列表

我有以下变量声明

Map<EventType<? extends Event>, Map<EventSource, List<EventHandler<? super Event>>>> eventHandlers;

使用java streams,我想先在eventType上过滤这个映射,然后在eventSource上过滤,最后是一个列表

如何使用java streams实现这一点,我尝试了几种不同的方法,但都没有成功。到目前为止,我所执行的是

List <Object> something = eventHandlers.entrySet().stream().filter(entry
                        -> entry.getKey() == event.eventType || event.eventType.isSubType(entry.getKey())
                ).map(Map.Entry::getValue).collect(Collectors.toList());

但我只是以List<Map<EventSource, List<EventHandler<? super Event>>>>结束

我如何做到这一点,任何帮助或指点将不胜感激

非常感谢


共 (1) 个答案

  1. # 1 楼答案

    扩展我的评论,类似这样的东西(没有编译器编写,因此可能有一些错误)应该可以工作:

    List<EventHandler<? super Event>> output = eventHandlers
        .entrySet()
        .stream()
        .filter(entry -> entry.getKey() == event.eventType || event.eventType.isSubType(entry.getKey()))
        .map(Map.Entry::getValue)
        .map(Map::entrySet)
        .flatMap(Set::stream)
        .filter(entry -> entry.getKey() == event.eventSource) // ? Modify the filter on event source according to your needs
        .map(Map.Entry::getValue)
        .flatMap(List::stream)
        .collect(Collectors.toList());
    

    请注意,可以使用lambdas而不是函数引用来缩短一点:

    List<EventHandler<? super Event>> output = eventHandlers
        .entrySet()
        .stream()
        .filter(entry -> entry.getKey() == event.eventType || event.eventType.isSubType(entry.getKey()))
        .flatMap(entry -> entry.getValue().entrySet().stream())
        .filter(entry -> entry.getKey() == event.eventSource) // ? Modify the filter on event source according to your needs
        .flatMap(entry -> entry.getValue().stream())
        .collect(Collectors.toList());