如何将嵌套列表转换为列表?

时间:2018-03-29 16:29:34

标签: java-8

我正在尝试转换一个for循环,该循环获取一个对象的列表并将该列表存储到另一个对象中:

/*List<Rbs> cellList = new ArrayList<Rbs>();
    for (CommonPrep commonTest : commonTest.values()) {
        cellList.addAll(commonTestInfo.getRbsList());
}*/

List<Rbs> cellList = 
          commonTest.values()
                    .stream()
                    .flatMap(rbsList -> rbsList.getRbsList().stream())
                    .collect(Collectors.toList());

有没有比使用两个流更好的方法(正如我现在所做的那样)?

1 个答案:

答案 0 :(得分:2)

略有不同的变体。

List<Rbs> cellList = 
    commonTest.values()
              .stream()
              .map(CommonPrep::getRbsList)
              .flatMap(Collection::stream)
              .collect(Collectors.toList());

正如您所看到的,最终您需要在stream.values().stream()N次调用flatMap方法(由于传递给flatMap的函数的返回值,其中N是从map操作返回的元素数。

实际上,每个中间操作也返回Stream<T>,因此有比我上面提到的更多的流对象。

没有办法避免它。一般而言,创建一个流是一种廉价的操作,所以你不应该担心它。

因此,除非您遇到性能问题,否则最好不要考虑创建了多少Stream对象,而是专注于编写查询以实现您想要的内容并让库处理剩下的内容。

即便如此,如果遇到性能问题,试图找到避免在每个函数调用上创建新流的方法,或者方法调用不会起作用,因为所有中间操作都会在每次调用时返回一个新流一些接受行为参数的操作也会返回新的流,就像传递给flatMap的函数一样。

由于流对象的创建,我非常怀疑您目前遇到的性能问题。无论如何,当您遇到性能问题时,您总是可以考虑并行。

在尝试并行之前了解几个因素非常重要。您可以阅读答案here以了解需要考虑的事项。