用Kotlin流收集物品
我有一个有Bag
的Player
,每个Bag
都有物品( String
):
class Player(val bags: List<Bag>) class Bag(val items: List<String>)
我想收集每个包和它的每个项目在一个列表中。 使用嵌套for循环,我这样做:
val player = Player(listOf(Bag(listOf("item1.1", "item1.2")), Bag(listOf("item2.1", "item2.2")))) val list = mutableListOf<Any>() for (bag in player.bags) { list.add(bag) for (item in bag.items) { list.add(item) } } //list contains [Bag@7adf9f5f, item1.1, item1.2, Bag@85ede7b, item2.1, item2.2]
我如何使用流实现相同的行为? 我已经尝试过了,但我只是拿到了物品,而不是包包:
val list = player.bags.flatMap { bag -> bag.items }
首先,你为什么要一个List<Any>
? 您通过使用这种数据类型丢失所有类型的信息。 你不能对这样的列表中的元素做任何事情,也不要做任何投射(当然,除了调用Any
方法)。
如果你真的想这样做,你可以这样使用flatMap
:
val list = player.bags.flatMap { bag -> listOf(bag) + bag.items }
如果列表的顺序不重要,我会这样做:
val list = player.bags.flatMap { it.items } + player.bags