需要将Seq [Option [A]]转换为Option [Seq [A]] [英] Need to convert a Seq[Option[A]] to Option[Seq[A]]

查看:122
本文介绍了需要将Seq [Option [A]]转换为Option [Seq [A]]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用案例

我有一个文件列表,这些文件可能具有有效的mime类型. 在我的代码中,我使用Option来表示.

I have a list of files that can might have a valid mime type or not. In my code, I represent this using an Option.

我需要将Seq [Option [T]]转换为Option [Seq [T]],以便在某些文件无效的情况下不处理列表.

I need to convert a Seq[Option[T]] to Option[Seq[T]] so that I do not process the list if some of the files are invalid.

错误

这是以下实现中的错误:

This is the error in the implementation below:

found   : (Option[Seq[A]], Option[A]) => Option[Seq[A]]
[error]  required: (Option[Any], Option[Any]) => Option[Any]
[error]     s.fold(init)(liftOptionItem[A])

实施

def liftOptionItem[A](acc: Option[Seq[A]], itemOption: Option[A]): Option[Seq[A]] = {
    {
      acc match {
        case None => None
        case Some(items) =>
          itemOption match {
            case None => None
            case Some(item) => Some(items ++ Seq(item))
          }
      }
    }
  }

  def liftOption[A](s: Seq[Option[A]]): Option[Seq[A]] = {
    s.fold(Some(Seq()))(liftOptionItem[A])
  }

此实现返回Option[Any]而不是Option[Seq[A],因为liftOptionItem[A]的类型不合适.

This implementation returns Option[Any] instead of Option[Seq[A] as the type of the liftOptionItem[A] does not fit in.

推荐答案

使用scalaz:

import scalaz._
import Sclaza._

val x:List[Option[Int]] = List(Option(1))
x.sequence[Option, Int] //returns Some(List(1))

val y:List[Option[Int]] = List(None, Option(1))
y.sequence[Option, Int] // returns None

这篇关于需要将Seq [Option [A]]转换为Option [Seq [A]]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆