首页 > 解决方案 > 如何从“分块”块构建列表?

问题描述

我正在处理“交替”行中的输入数据。

为了很好地处理这个问题,我(和SO)想出了这个代码:

val foobars = mutableListOf<FooBar>()

lines.chunked(2) { (l1, l2) ->
    foobars.add( FooBar( generateFoo(l1), generateBar(l2) )
}

上面的方法可行,但是首先创建那个空列表,然后附加到它以“收集”新创建的对象似乎有点奇怪。

如果这将是一个 Java 流,那么“收集”部分将是直截了当的,使用 List 收集器。

现在我想知道是否有更优雅/规范的方式在 kotlin 中收集我的列表项?

标签: collectionskotlincollectors

解决方案


它实际上比你想象的要简单,例如

val foobars = lines.chunked(2) { (l1, l2) ->
  FooBar( generateFoo(l1), generateBar(l2) )
}.toMutableList()

与 Java 流的不同之处在于,您实际上可以直接对列表 (/sequence/iterable) 进行操作,并且每次调用类似chunked, filter, map, toList,toMutableList等的东西时都会得到一个新的作为回报。所以在调用chunked(+ 转换) 你得到一个包含转换的新列表。然后,您可以通过调用将其转换为(新的)可变列表toMutableList()

如果您以后不需要更改列表,您可以跳过toMutableList()并且您已经有了您的列表。


推荐阅读