为什么 ide 在使用 Iterable.flatMap 时会说“在闭包中捕获的值”,但在使用 map then flatten 时却不会?

und*_*one 9 kotlin

inline fun <T : Any, E : Any> batchQuery(
    paramsToBeChunked: Collection<T>,
    batchSize: Int = 500,
    crossinline queryAction: (params: Collection<T>) -> List<E>
) = paramsToBeChunked.chunked(batchSize).flatMap { queryAction(it) } 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

inline fun <T : Any, E : Any> batchQuery(
    paramsToBeChunked: Collection<T>,
    batchSize: Int = 500,
    crossinline queryAction: (params: Collection<T>) -> List<E>
) = paramsToBeChunked.chunked(batchSize).map { queryAction(it) }.flatten()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

使用 flatMap 是否有潜在的问题?

恕我直言,map、flatten、flatMap 都是内联函数,所以这两个实现是等价的,对吗?

Lut*_*ław 2

如果没有乐趣,inline那么在这两种情况下都queryAction必须在闭包中捕获,因为它来自 lambda 外部。这意味着在后台生成的类持有对该变量的引用,并且当最终执行 lambda 时,它会使用该引用。

但在这里,它内联得很好。Idea 尽力提供有关捕获变量的信息,但在这种情况下,这可能是 Idea 静态分析的限制。第一条消息是不正确的。

正如@broot 建议的,您可以.map { f(it) }仅替换为.map(f).