在 kotlin 中通过调用函数生成项目列表的惯用方法是什么?

Lic*_*ker 1 list kotlin

假设有一个函数返回单个可为空的返回值。例如:

fun getItem(): String?
Run Code Online (Sandbox Code Playgroud)

我想通过调用此函数直到它返回来创建一个新的项目列表null

我的想法是编写一个迭代器来迭代返回值,直到它是null. 但是,是否有更优雅或更惯用的方法来解决这个问题?

cac*_*acs 6

就像 @Slaw 在评论中所说的那样,您可以使用generateSequence并向其传递对您的函数的引用(或者如果需要,可以调用它的 lambda)来创建一个Sequence生成值的函数。当函数返回时终止null是内置行为:

返回一个序列,该序列调用函数来计算每次迭代的下一个值,直到函数返回 null。

所以你实际上可以做得到generateSequence(::getItem)你的“迭代器”,并调用toList或任何你喜欢的序列函数。但这不是一个实际的- 你可以通过执行然后调用它Iterator来获得其中之一。toList()iterator()

有很多方法可以实现此功能,但generateSequence我认为这是最简单的。如果您需要更多控制,您可以链接一个takeWhile()调用来创建一个在特定条件/值上终止的序列,或者您可以sequence对您需要的项目使用构建器函数yield(假设您希望其中有空值)。还有像 @Alex.T 的“添加到列表”技巧这样的非序列方法(尽管 - 我还没有检查过 - 我想这就是generateSequence -> toList幕后的操作)