首页 > 解决方案 > Java 流从地图中获取列表

问题描述

我有以下变量声明

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

使用 java 流我想先在 eventType 上过滤这个地图,然后在 eventSource 上过滤,最后是一个 List。

我该如何使用java流来做到这一点,我尝试了几种不同的方法但没有成功。到目前为止我的实现是

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>>>>

我如何实现这一点,任何帮助或指示将不胜感激。

非常感谢

标签: javajava-8java-stream

解决方案


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

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());

推荐阅读