Kotlin - 如何在地图操作后将对象列表转换为单个对象?
Kotlin - How to convert a list of objects into a single one after map operation?
我正在努力研究 Kotlin 中的 map 和 reduce 操作。至少,我想它减少了我想做的事情。
假设我有一个名为 Car 的 class,它接受 CarPart 的任意数字(可变参数构造函数)。然后,我有一个 CarPart 列表,我将执行 map 操作,根据操作结果我需要构建 one Car 使用每个子元素,大致如下:
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:我知道 class 设计可以更好并且不采用可变参数,这只是我正在重构的遗留应用程序的一个示例,最初它是 Java class 采用我现在无法更改的可变参数。
PS.2:映射到 String 然后从该 String 创建对象的示例只是为了示例。实际代码在列表中抓取一个对象。
您可以在创建列表之外提取 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
知道我们传递的是列表的元素而不是列表本身,我们需要展开运算符。
您可以简单地在数组上使用扩展运算符 (*):
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) }
我正在努力研究 Kotlin 中的 map 和 reduce 操作。至少,我想它减少了我想做的事情。
假设我有一个名为 Car 的 class,它接受 CarPart 的任意数字(可变参数构造函数)。然后,我有一个 CarPart 列表,我将执行 map 操作,根据操作结果我需要构建 one Car 使用每个子元素,大致如下:
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:我知道 class 设计可以更好并且不采用可变参数,这只是我正在重构的遗留应用程序的一个示例,最初它是 Java class 采用我现在无法更改的可变参数。
PS.2:映射到 String 然后从该 String 创建对象的示例只是为了示例。实际代码在列表中抓取一个对象。
您可以在创建列表之外提取 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
知道我们传递的是列表的元素而不是列表本身,我们需要展开运算符。
您可以简单地在数组上使用扩展运算符 (*):
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) }