Kotlin выбрать из списка - PullRequest
       113

Kotlin выбрать из списка

0 голосов
/ 05 августа 2020

У меня такая ситуация, как

class Ball {}
class WhiteBall : Ball {}
class BlackBall : Ball {}
 
val listOfBalls: List<Ball> = ...

Как элегантно получить первые шары из списка / массива, если, например, я взял <= 5 БЕЛЫХ ШАРОВ? </p>

Я знаю только так:

val NMAX = 5
var balls = 0
val listOfBalls: List<Ball> = ...
return listOfBalls.takeWhile { ball ->
   if (ball is WhiteBall) balls++
   return@takeWhile balls <= NMAX + 1
} 

// пример выбора // B, B, B, B, B, W, W, W, B, B, ..., B, W, W

ОБНОВЛЕНИЕ: Кажется, я не очень четко описал, что хочу выбрать. Предположим, у нас есть 2 типа сущностей - AlbumTitle и AlbumPicture, которые образуют listOf<AlbumItem>(...).

Простой список содержит эти объекты в некотором порядке, например

  1. AlbumTitle, AlbumPicture , AlbumTitle, AlbumPicture , AlbumPicture
  2. AlbumTitle, AlbumTitle, AlbumTitle, AlbumPicture, AlbumPicture

Я хочу выбрать все объекты в том же порядке, но перестану заполнять мой новый список, когда я сделаю 2 снимка.

Поэтому я должен отфильтровать

  1. AlbumTitle, AlbumPicture , AlbumTitle, AlbumPicture
  2. AlbumTitle, AlbumTitle, AlbumTitle, AlbumPicture, AlbumPicture

1 Ответ

1 голос
/ 06 августа 2020

Элегантно (без активного создания промежуточных коллекций):

listOfBalls.asSequence()
.filterIsInstance<WhiteBall>()
.take(5)
.toList()

См. Последовательности в Kotlin. Также полезное видео от Android разработчиков .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...