假设有一个函数返回单个可为空的返回值。例如:
fun getItem(): String?
Run Code Online (Sandbox Code Playgroud)
我想通过调用此函数直到它返回来创建一个新的项目列表null。
我的想法是编写一个迭代器来迭代返回值,直到它是null. 但是,是否有更优雅或更惯用的方法来解决这个问题?
就像 @Slaw 在评论中所说的那样,您可以使用generateSequence并向其传递对您的函数的引用(或者如果需要,可以调用它的 lambda)来创建一个Sequence生成值的函数。当函数返回时终止null是内置行为:
返回一个序列,该序列调用函数来计算每次迭代的下一个值,直到函数返回 null。
所以你实际上可以做得到generateSequence(::getItem)你的“迭代器”,并调用toList或任何你喜欢的序列函数。但这不是一个实际的- 你可以通过执行然后调用它Iterator来获得其中之一。toList()iterator()
有很多方法可以实现此功能,但generateSequence我认为这是最简单的。如果您需要更多控制,您可以链接一个takeWhile()调用来创建一个在特定条件/值上终止的序列,或者您可以sequence对您需要的项目使用构建器函数yield(假设您希望其中有空值)。还有像 @Alex.T 的“添加到列表”技巧这样的非序列方法(尽管 - 我还没有检查过 - 我想这就是generateSequence -> toList幕后的操作)