我的Player
有Bag
个,每个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 }
答案 0 :(得分:2)
首先,为什么要List<Any>
?使用此数据类型会丢失所有类型信息。您无法对此类列表中的元素执行任何操作,而无需进行某些转换(当然,除了在Any
上调用方法之外)。
如果您真的想这样做,可以像这样使用flatMap
:
val list = player.bags.flatMap { bag -> listOf(bag) + bag.items }
如果列表的顺序不重要,我会这样做:
val list = player.bags.flatMap { it.items } + player.bags