2017-02-09 104 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