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) } 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()¿Hay algún problema potencial al usar flatMap?
En mi humilde opinión, map, flatten, flatMap son todas funciones en línea, por lo que estas dos implementaciones son equivalentes, ¿es así?
Si la diversión no estuviera en inline , entonces, en ambos casos, queryAction tendría que capturarse en un cierre, porque proviene de fuera de la lambda. Significa que una clase que se genera bajo el capó contiene una referencia a la variable, y cuando finalmente se ejecuta la lambda, utiliza esa referencia.
Pero aquí, está en línea muy bien. Idea intenta brindar información sobre las variables capturadas, pero en esta situación podría ser una limitación del análisis estático de Idea. El primer mensaje es simplemente incorrecto.
Como sugirió @broot, puede reemplazar .map { f(it) } con solo .map(f) .