2017-02-09 23 views
1

У меня есть Player, который имеет Bag с, и каждый Bag имеет элементы (String):Сбор предметов с Котлин потоков

class Player(val bags: List<Bag>) 
class Bag(val items: List<String>) 

я хочу собрать каждую сумку и каждый элемент его в одном списке. Использование вложенных для циклов я делаю так:

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

Спасибо за редактирование Кирилл. Я начал писать ответ, думая, что это вопрос Скалы: P – marstran