2017-02-09 74 views
1

我有一个PlayerBag s,而每个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 [[email protected], item1.1, item1.2, [email protected], item2.1, item2.2] 

我怎样才能实现相同的行为使用流?我已经试过这一点,但我刚刚得到的项目,而不是包装袋:

val list = player.bags.flatMap { bag -> bag.items } 

回答

2

首先,你为什么要一个List<Any>?使用这种数据类型会丢失所有类型的信息。你不能对这样的列表中的元素做任何事情,也不要做任何投射(当然,除非调用方法Any)。

如果你真的想这样做,你可以使用flatMap这样的:

val list = player.bags.flatMap { bag -> listOf(bag) + bag.items } 

如果列表的顺序并不重要,我只是这样做:

val list = player.bags.flatMap { it.items } + player.bags 
+1

大,谢谢!我完全同意你的看法。其实,我没有使用名单,但我简化了它的问题。 + 1。 –

+0

感谢编辑Kirill。我开始写这个答案,认为这是一个斯卡拉问题:P – marstran