gpt4 book ai didi

java - 如何使用额外命令将嵌套 for 循环转换为 java 流

转载 作者:行者123 更新时间:2023-12-02 01:23:45 26 4
gpt4 key购买 nike

我有一个嵌套的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com