Как извлечь элементы последовательности, завернутые в Option в Scala? - PullRequest
0 голосов
/ 05 июля 2018

Я изучаю Scala и борюсь с Option[Seq[String]] объектом, который мне нужно обработать. Существует небольшой массив строк Seq("hello", "Scala", "!"), которые мне нужно отфильтровать по условию charAt(0).isUpper.

Делать это на равнине val arr = Seq("hello", "Scala", "!") так же просто, как и arr.filter(_.charAt(0).isUpper). Однако сделать то же самое для Option(Seq("hello", "Scala", "!")) не получится, поскольку сначала нужно вызвать .getOrElse. Но даже тогда, как вы можете применить условие?

arr.filter(_.getOrElse(false).charAt(0).isUpper неправильно. Я перепробовал много вариантов, и поиск stackoverflow тоже не помог, и мне интересно, возможно ли это вообще. Есть ли идиоматический способ обработки Option упакованных коробок в Scala?

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Если вы хотите применить f: X => Y к значению x типа X, вы пишете f(x).

Если вы хотите применить f: X => Y к значению ox типа Option[X], вы пишете ox.map(f).

Похоже, вы уже знаете, что хотите сделать с последовательностью, поэтому просто вставьте соответствующий f в map.

Пример:

val ox = Option(Seq("hello", "Scala", "!"))

ox.map(_.filter(_(0).isUpper)) // Some(Seq("Scala"))
0 голосов
/ 05 июля 2018

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

Option(Seq("hello", "Scala", "!")) match {
      case Some(x) => x.filter(_.charAt(0).isUpper)
      case None => Seq()
    }
0 голосов
/ 05 июля 2018

Вы можете просто позвонить в foreach или отобразить карту, например, arr.map(seq => seq.filter(_.charAt(0).isUpper))

...