2015-03-05 5 views
-1

после сопоставления с образцом BasicDBobject из Монго Casbas я получить что-то вроде этого:.Скала расплющить Список (List (Список (String, List (String, String)

val arr = List(Some(None), 
       List(List(Some(None), 
         Some(None), 
         Some("54c22f3369702d7fdb8c0100"), 
         Some(None), 
         Some(None), 
         Some(None), 
         Some(None)), 
        List(Some(None), 
         Some(None), 
         Some("54c22f3369702d7fdb8c0100"), 
         Some(None), 
         Some(None), 
         Some(None), 
         Some(None)), 
        List(Some(None), 
         Some(None), 
         Some("54c22f3369702d7fdb8c0100"), 
         Some(None), 
         Some(None), 
         Some(None), 
         Some(None))), 
        Some(None)) 

мне нужно придавить это в List(Some(none), Some(string) ..) в одном списке Как я могу сделал это

примера того, что мне нужно от обр:

List(Some("54c22f3369702d7fdb8c0100"), 
Some("54c22f3369702d7fdb8c0100"), 
Some("54c22f3369702d7fdb8c0100")) 

я получаю аранжировку этого кода:

val subjectUsers = x.map { 
     case ("entries", y: BasicDBList) => y(0) match { 
      case entries: BasicDBList => entries.toList map { 
      case z: BasicDBObject => z.toList map { 
       case ("type", "subscribe") => Some(z("subject_id")) 
       case ("info", v: BasicDBObject) => Some(v("user")) 
       case _ => Some(None) 
      } 
      case _ => Some(None) 
      } 
     } 
     case _ => Some(None) 
     }.toList 

Мне нужен только список (String), как

List(Some("54c22f3369702d7fdb8c0100"), Some("54c22f3369702d7fdb8c0100")) 
+0

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

+0

Я обновил вопрос! – Legendary

+0

Теперь у нас есть противоречие. Вы говорите, что хотите сначала «Some (None)», но ваш вывод в примере отсутствует. Можете ли вы описать, что хотите? вы хотите собрать все суббулистические записи, которые являются Some (string)? –

ответ

1

Если это действительно произвольная структура вы могли бы использовать shapeless' everything combinator собрать все Some[String] с в пути типобезопасного. Это будет работать, только если у вас есть вся информация о типе во время компиляции. Если вы хотите сделать это в зависимости от типа исполнения лучший подход, вероятно, является рекурсивной функцией, которая соответствует схеме:

def extractSomeStrings(a: Any): List[Some[String]] = a match { 
    case l: List[_] => l flatMap extractSomeStrings 
    case None => List() 
    case Some(x) => x match { 
    case s: String => List(Some(s)) 
    } 
} 

Это будет (преднамеренно) бросить MatchError если список содержит ничего, кроме List с, None с и Some[String] s - если у вас есть другие случаи, вы можете добавить case s для их обработки.

+0

[error] case s: String => Some (s) ошибка компиляции: несоответствие типа – Legendary

+0

Ах да, забыли, что нам нужен внешний «Список». – lmm

+0

Это работает! Рэй благодарит тебя! я – Legendary

Смежные вопросы