Для понимания использования - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть список, который, например, имеет 101 запись, я хочу отправить данные в партии из 10. list.grouped (10) вернет 10 списков с 10 записями и 1 список с одной записью. Я хочу отправить все десять списков с 10 записями в метод futureSend и хочу получить список с одной записью (если он существует в этом сценарии, но если список содержит 100 записей, то возвращает пустой список) для понимания. Поэтому, если list.size не равен десяти, я не хочу отправлять список в futureSend и получать этот список для понимания.


   val listRes = list.grouped(10)

      for {
        list <- listRes
        if list.size == 10
        _ = futureSend(list) map { result =>
          println("sent")
          )
        }
      } yield {}


Я хочу получить список размером менее 10 (в этом случае не вызывать метод futureCall), и если все списки имеют размер 10, выведите пустой список.

1 Ответ

2 голосов
/ 19 апреля 2020

A for понимание - неправильный инструмент для работы.

val listRes = list.grouped(10).toList

listRes.init.foreach{group => futureSend(group); println("sent")}
val last = listRes.last
val remainder = if (last.length < 10) last
                else {
                  futureSend(last)
                  println("sent")
                  List.empty[ElementType]
                }

Если вы используете Scala 2.13.x, тогда есть немного более эффективный вариант.

val remainder = List.unfold(list.grouped(10)){ itr =>
    Option.when(itr.hasNext) {
      val thisBatch = itr.next()
      if (itr.hasNext || thisBatch.size == 10) {
        futureSend(thisBatch)
        println("sent")
        (List(), itr)
      } else (thisBatch, itr)
    }
  }.flatten
...