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

标签 java java-stream

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

相关文章:

Java 并行流 : there's a way to navigate a binary tree?

java - 当我使用 Java 8 Stream.of 原始类型时,结果很困惑

recursion - 使用 Java 8 Streams 求和树节点

Java 流 : merge/map collections

java - 有效计算给定总和的所有对

java - 无法使用 sun-web.xml 设置字符编码

java - 我应该在我的 Java 程序中使用多少个线程?

java - 通过java流计算二维数组中的邻居

java - 如何将 JUnit Parameterized runner 与 varargs 构造函数一起使用?

java - 最大/最小堆树可以包含重复值吗?