Понимание карты, плоской карты и опции в Scala - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь понять, как использовать концепции функционального программирования (map, flatmap, filter ..) в scala в следующем случае.В основном я пытаюсь отфильтровать Inner1 с id и прочитать value здесь.Не могли бы вы, пожалуйста, как я могу прочитать v (значение), если у меня есть ссылка на out объект

final case class Inner2(v:Option[String])
final case class Inner1(id: String,inner2: Seq[Inner2])
final case class Out(inner1: Option[Seq[Inner1]])
val inner2 = Inner2(Some("value"))
val inner11 = Inner1("id",List(inner2))
val inner12 = Inner1("id2",List())
val out = Out(Some(List(inner11,inner12)))

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

out.inner1
  .flatMap(_.headOption)
  .filter(_.id=="id")
  .map(_.inner2)
  .flatMap(_.headOption)
  .flatMap(_.v)

Ответы [ 2 ]

2 голосов
/ 22 сентября 2019

Ищете что-то вроде этого?

out.inner1
  .flatMap {
    _.withFilter(_.id == "id").flatMap {
      _.inner2.flatMap {
        _.v
      }
    }.headOption
  }
//println gives `Some(value)`

Если вы хотите извлечь значение Option, вы можете использовать .getOrElse("") в конце

1 голос
/ 22 сентября 2019

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

Я только что удалил Optionиз класса Outer (как пустой Seq также None):

final case class Out(inner1: Seq[Inner1])

Тогда код получает это:

out.inner1
   .filter(_.id=="id")
   .flatMap(_.inner2)
   .flatMap(_.v.toSeq) // > List(value)
   .headOption         // > Some(value)

При правильных именах это может выглядетькак:

repo.users // Out -> Repo - Inner1 > User
   .filter(_.id=="id")
   .flatMap(_.addresses) // Inner2 -> Address
   .flatMap(_.maybeStreet.toSeq) // value -> optional street
   .headOption         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...