Как построить список из «чанкированного» блока? - PullRequest
0 голосов
/ 27 августа 2018

Я обрабатываю входные данные, которые поступают «чередующимися» строками.

Чтобы справиться с этим, я (и SO ) придумала следующий код:

val foobars = mutableListOf<FooBar>()

lines.chunked(2) { (l1, l2) ->
    foobars.add( FooBar( generateFoo(l1), generateBar(l2) )
}

Вышесказанное работает, но кажется немного странным сначала создать этот пустой список, а затем добавить к нему, чтобы "собрать" только что созданные объекты.

Если это будет поток Java, то часть "сбора" будет прямой, используя сборщик списков.

Теперь мне интересно, есть ли более элегантный / канонический способ сбора элементов списка в kotlin?

1 Ответ

0 голосов
/ 27 августа 2018

Это на самом деле проще, чем вы думаете, например,

val foobars = lines.chunked(2) { (l1, l2) ->
  FooBar( generateFoo(l1), generateBar(l2) )
}.toMutableList()

Отличие от потока Java заключается в том, что вы можете напрямую работать со списком (/ sequence / iterable) и получать новый ответный вызов каждый раз, когда вызываете что-то вроде chunked, filter, * 1006. *, toList, toMutableList и т. Д. Итак, после вызова chunked (+ преобразование) вы получили новый список, содержащий преобразования. Затем вы можете преобразовать его в (новый) изменяемый список, просто вызвав toMutableList().

И если вам не нужно изменять список позже, вы можете просто пропустить toMutableList(), и у вас уже есть список.

...