我有一个嵌套的 for 循环。每个消息类都与 MessageDetail 类相关(一对多关系),我想将下面的 for 循环转换为流。
for (Message m:messages){
System.out.println(m.getText());
for (MessageDetail m2:m.getMessageDetails()){
System.out.println(m2.getId+m2.getStatus());
}
}
我尝试了这段代码,但无法在上层显示 e.getText。
messages.stream().flatMap(e-> e.getMessageDetails().stream().map(
e2->e.getText()+"-->{"+e2.getId()+"," +e2.getStatus()+"}"
)).collect(Collectors.toList());
输出如下:
[
Hi-->{1,OK},
Hi-->{2,OK},
Hi-->{4,NOT_DELIVER},
Bye-->{5,OK},
Bye-->{6,NOT_DELIVER},
Bye-->{7,NOT_DELIVER},
]
但我想喜欢这个:
[
Hi [ {2,OK},{3,OK},{4,NOT_DELIVER}]
Bye[ {5,OK},{6,NOT_DELIVER},{7,NOT_DELIVER}]
]
最佳答案
仅当您希望流中的每个元素转换为结果流中的多个元素时,才应使用
flatMap
。此处,原始流中的每个 Message
对应于结果列表中的一个 String
,因此您不应使用 flatMap
。
使用 map
代替:
messages.stream().map(
e -> e.getText() + "-->" +
e.getMessageDetails().stream().map(d -> "{" + d.getId() + ", " + d.getStatus() + "}").collect(Collectors.toList()).toString())
.collect(Collectors.toList());
如果您可以编辑 Message
类以及 getMessageDetails
返回的任何类,我建议您重写它们的 toString
方法(或编写自己的方法)返回字符串的方法):
// Message class:
public String toString() {
return getText() + "-->" + getMessageDetails().toString();
}
// MessageDetails class
public String toString() {
return "{" + getId() + ", " + getStatus() + "}";
}
那么你可以这样做:
messages.stream().map(Message::toString).collect(Collectors.toList());
关于java - 如何使用额外命令将嵌套 for 循环转换为 java 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57267507/