用Kotlin流收集物品

我有一个有BagPlayer ,每个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