使用Java8流迭代map中的列表
我有一个映射,其中包含日期作为键,另一个映射(字符串作为键,列表作为值)作为值<代码>映射,我想填充另一个以字符串作为键,以双精度作为值的映射。FlexServer的内容如下所示:使用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; } 因此,基本上我想先迭代
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));