Функции цепочки Scala, когда некоторые без явных проверок - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь найти правильный способ выполнения связанных функций, пока возвращаются некоторые.Возвращение None должно прекратить выполнение дальше.Я считаю, что должен быть способ сделать это без проверок внутри каждой функции.Простой пример того, что я имел в виду:

  def a(x: Int): Option[Int] = {
    println(x)
    Some(x+1)
  }

  def stop(x: Int): Option[Int] = {
    println(x)
    None
  }

  a(1)
    .map(a)
    .map(a)
    .map(a)
    .map(stop)
    //Do not execute further
    .map(a)
    .map(a)

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы можете использовать for для объединения map и flatMap вызовов таким образом, чтобы их было легко прочитать:

for {
  a1 <- a(1)
  a2 <- a(a1)
  a3 <- stop(a2)
  a4 <- a(a3)
  a5 <- a(a4)
} yield a5

Если все вызовы возвращают Some, тогда результат равен Some(a5), но если какой-либо вызов вернет None, тогда обработка будет остановлена ​​и результат будет None.Таким образом, в этом случае он остановится после вызова stop и вернет None.

Использование for позволяет использовать значимое имя для промежуточных результатов, облегчая понимание кода.

0 голосов
/ 12 декабря 2018

Использование flatMap

a(1)
.flatMap(a)
.flatMap(stop)
//Do not execute further
.flatMap(a)
.flatMap(a)

В этом примере a будет вызываться только дважды.

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