Kotlin-如何在地图操作后将对象列表转换为单个对象



我正试图了解映射减少Kotlin中的操作。至少,我想这会减少我想做的事情

假设我有一个名为Car的类,它接受CarPart中的任何数字(varargs构造函数(。然后,我有一个CarPart的列表,我将对其进行映射操作,根据操作结果,我需要使用每个子元素构建一个汽车,大致如下:

class CarPart(val description: String)
class Car(vararg val carPart: CarPart)
val carParts = listOf(CarPart("Engine"), CarPart("Steering Wheel")))
carParts.map { it.description.toUpperCase() }
.map { CarPart(it) }
.reduce { acc, carPart -> Car(carPart) }  <--- I'm struggling here, is reduce what I should be doing 
to construct one car from all the subelement?

PS.1:我知道类设计可能会更好,不需要varargs,这只是我正在重构的遗留应用程序的一个例子,最初是一个使用varargs的Java类,我现在无法更改。

PS.2:映射到一个String,然后从该String创建一个对象的例子只是为了这个例子。实际的代码获取列表中的一个对象。

您可以简单地在数组上使用排列运算符(*(:

val mappedCarParts = carParts
.map { it.description.toUpperCase() }
.map { CarPart(it) }
.toTypedArray()
val car = Car(*mappedCarParts)
// Or even:
val car = carParts
.map { it.description.toUpperCase() }
.map { CarPart(it) }
.toTypedArray()
.let{ Car(*it) }

您可以在创建列表之外提取Car的构造函数。我看不出你为什么要把它放在里面。

val car = Car(
*carParts
.map { CarPart(it.description.uppercase(Locale.getDefault())) } //keep the .toUpperCase() if you are using an old version of Kotlin
.toTypedArray()
)

我们需要那里的排列运算符,以便vararg知道我们正在向它传递列表的元素,而不是列表本身。

最新更新