使用Java8流迭代map中的列表

使用Java8流迭代map中的列表,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个映射,其中包含日期作为键,另一个映射(字符串作为键,列表作为值)作为值映射,我想填充另一个以字符串作为键,以双精度作为值的映射。FlexServer的内容如下所示: public class FlexiServer { private String serverNumber; private Double quantity; private Integer level; private String parentServer; } 因此,基本上我想先迭代

我有一个映射,其中包含日期作为键,另一个映射(字符串作为键,列表作为值)作为值<代码>映射,我想填充另一个以字符串作为键,以双精度作为值的映射。FlexServer的内容如下所示:

public class FlexiServer {
    private String serverNumber;
    private Double quantity;
    private Integer level;
    private String parentServer;
}
因此,基本上我想先迭代外部映射以获得内部映射,然后迭代内部映射以获得FlexiServers列表,并填充新映射,其中server number作为键,数量列表作为值。如何使用Java8流实现这一点

我尝试了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());
                    }
                }
            }
        }
if(data.isPresent()){
for(Map.Entry:data.get().entrySet()){
对于(Map.Entry innerEntry:Entry.getValue().entrySet()){
对于(FlexiServer dto:innerEntry.getValue()){
DailRequirements.computeIfAbsent(dto.getserverNumber(),
k->newarraylist()).add(dto.getQuantity());
}
}
}
}

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

Map result=Map.values()
.stream()
.map(映射::值)
.flatMap(集合::流)
.flatMap(列表::流)
.collect(Collectors.groupingBy(FlexiServer::getServerNumber,Collectors.mapping(FlexiServer::getQuantity,Collectors.toList());

您可以使用Java8 StreamApi以这种方式完成

    Map<LocalDate, Map<String, List<FlexiServer>>> localDateMapMap = new HashMap<>();
    localDateMapMap.put(LocalDate.now(), new HashMap<String, List<FlexiServer>>() {{
      put("1", new ArrayList<FlexiServer>() {{
        add(new FlexiServer() {{
          setQuantity(200D);
          setServerNumber("001");
        }});
        add(new FlexiServer() {{
          setQuantity(500D);
          setServerNumber("001");
        }});
        add(new FlexiServer() {{
          setQuantity(800D);
          setServerNumber("002");
        }});
      }});
      put("2", new ArrayList<FlexiServer>() {{
        add(new FlexiServer() {{
          setQuantity(200D);
          setServerNumber("003");
        }});
        add(new FlexiServer() {{
          setQuantity(500D);
          setServerNumber("001");
        }});
        add(new FlexiServer() {{
          setQuantity(800D);
          setServerNumber("001");
        }});
      }});
    }});
    Map<String, Double> map = new HashMap<>();
    localDateMapMap.values().stream()
        .map(Map::values)
        .flatMap(Collection::stream)
        .flatMap(Collection::stream)
        .forEach(flexiServer -> {
          if (map.containsKey(flexiServer.getServerNumber())) {
            map.replace(flexiServer.getServerNumber(),
                map.get(flexiServer.getServerNumber()) + flexiServer.getQuantity());
          } else {
            map.put(flexiServer.getServerNumber(), flexiServer.getQuantity());
          }
        });
    map.forEach((serverNumber, quantity) -> System.out
        .println("ServerNumber = " + serverNumber + "  Quantity = " + quantity));
Map localDateMapMap=newhashmap();
LocalDateMap.put(LocalDate.now(),new HashMap()){{
put(“1”,新数组列表(){{
添加(新的FlexiServer(){{
设定量(200D);
设置服务器编号(“001”);
}});
添加(新的FlexiServer(){{
设定量(500D);
设置服务器编号(“001”);
}});
添加(新的FlexiServer(){{
设定量(800D);
设置服务器编号(“002”);
}});
}});
put(“2”,新数组列表(){{
添加(新的FlexiServer(){{
设定量(200D);
设置服务器编号(“003”);
}});
添加(新的FlexiServer(){{
设定量(500D);
设置服务器编号(“001”);
}});
添加(新的FlexiServer(){{
设定量(800D);
设置服务器编号(“001”);
}});
}});
}});
Map Map=newhashmap();
LocalDateMap.values().stream()
.map(映射::值)
.flatMap(集合::流)
.flatMap(集合::流)
.forEach(flexiServer->{
if(map.containsKey(flexiServer.getServerNumber()){
map.replace(flexiServer.getServerNumber(),
get(flexiServer.getServerNumber())+flexiServer.getQuantity());
}否则{
put(flexiServer.getServerNumber(),flexiServer.getQuantity());
}
});
map.forEach((服务器号,数量)->System.out
.println(“ServerNumber=“+ServerNumber+”数量=“+Quantity”);

那么,到目前为止您尝试过什么?我尝试过使用for循环,但后来嵌套了3个循环,所以我觉得这不是一个好方法。我收到一个错误,说collect(java.util.stream.Collector,java.util.Map>)原因:不存在类型变量的实例,因此列表符合FlexServerThank,它起作用了,你知道一些很好的教程或帖子吗?我可以从那里了解java streams的概念,我知道网上有很多,但我只是想问一些建议。这是最好的在线阅读@LouiDon’不要在家里尝试。你是什么意思?!
    Map<LocalDate, Map<String, List<FlexiServer>>> localDateMapMap = new HashMap<>();
    localDateMapMap.put(LocalDate.now(), new HashMap<String, List<FlexiServer>>() {{
      put("1", new ArrayList<FlexiServer>() {{
        add(new FlexiServer() {{
          setQuantity(200D);
          setServerNumber("001");
        }});
        add(new FlexiServer() {{
          setQuantity(500D);
          setServerNumber("001");
        }});
        add(new FlexiServer() {{
          setQuantity(800D);
          setServerNumber("002");
        }});
      }});
      put("2", new ArrayList<FlexiServer>() {{
        add(new FlexiServer() {{
          setQuantity(200D);
          setServerNumber("003");
        }});
        add(new FlexiServer() {{
          setQuantity(500D);
          setServerNumber("001");
        }});
        add(new FlexiServer() {{
          setQuantity(800D);
          setServerNumber("001");
        }});
      }});
    }});
    Map<String, Double> map = new HashMap<>();
    localDateMapMap.values().stream()
        .map(Map::values)
        .flatMap(Collection::stream)
        .flatMap(Collection::stream)
        .forEach(flexiServer -> {
          if (map.containsKey(flexiServer.getServerNumber())) {
            map.replace(flexiServer.getServerNumber(),
                map.get(flexiServer.getServerNumber()) + flexiServer.getQuantity());
          } else {
            map.put(flexiServer.getServerNumber(), flexiServer.getQuantity());
          }
        });
    map.forEach((serverNumber, quantity) -> System.out
        .println("ServerNumber = " + serverNumber + "  Quantity = " + quantity));