java - 使用java 8流迭代map的map内的列表

标签 java java-8 java-stream

我有一个包含日期作为键和(另一个字符串作为键和列表作为值的映射)作为值的映射。 Map<LocalDate, Map<String, List<FlexiServer>>> ,我想填充另一个以 String 作为键、以 double 作为值的映射。 FlexiServer的内容是

public class FlexiServer {
    private String serverNumber;
    private Double quantity;
    private Integer level;
    private String parentServer;
}

所以,基本上我想首先从外部映射迭代以获取内部映射,然后迭代内部映射以获取 FlexiServer 列表并填充以服务器编号作为键、数量列表作为值的新映射。我如何使用 java 8 流来做到这一点?

我尝试使用 for 循环,但我想使用 Java 流替换它。

if(data.isPresent()) {
            for(Map.Entry<LocalDate, Map<String, List<FlexiServer>>> entry : data.get().entrySet()) {
                for(Map.Entry<String, List<FlexiServer>> innerEntry : entry.getValue().entrySet()) {
                    for(FlexiServer dto : innerEntry.getValue()) {
                        dailyRequirements.computeIfAbsent(dto.getserverNumber(),
                            k -> new ArrayList<>()).add(dto.getQuantity());
                    }
                }
            }
        }

最佳答案

只需从外部映射和内部映射中获取值,然后使用 Collectors.groupingby

Map<String, List<Double>> result = map.values()
                                      .stream()
                                      .map(Map::values)
                                      .flatMap(Collection::stream)
                                      .flatMap(List::stream)
            .collect(Collectors.groupingBy(FlexiServer::getServerNumber, Collectors.mapping(FlexiServer::getQuantity, Collectors.toList())));

关于java - 使用java 8流迭代map的map内的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60549472/

相关文章:

Java 8 从列表中删除重复的字符串而不考虑大小写

java - 如何向现有 Java 8 流添加单个 Key 值?

java - 使用非最终变量将 Java Map.Entry 传输到 Stream

java - 如何在两个不同的类中使用相同的方法(JavaFX 和 Scenebuilder)?

java - Liferay + Vaadin 的 Selenium gui 测试

java - 如何让 Tomcat 接受 URL 中未转义的括号?

java - 为什么这个lambda表达式可以分配给不同的函数接口(interface)呢?

java - Arrays.sort() 和 Arrays.parallelSort() 之间的区别

java - 生成 boolean 流

Java:如何编写一个使用 boolean 值和字符串仅识别大写字母的程序