使用Kotlin流收集物品

时间:2017-02-09 08:29:43

标签: functional-programming kotlin

我的PlayerBag个,每个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 }

1 个答案:

答案 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