Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在模式匹配中记录警告,但不返回任何_Scala - Fatal编程技术网

Scala 在模式匹配中记录警告,但不返回任何

Scala 在模式匹配中记录警告,但不返回任何,scala,Scala,我有一个数组的iterable,我正试图将其转换为case类,我正在映射它们来实现这一点。如果数组不能转换为case类,我想记录一个警告并继续映射。但是,当我实现该警告时,返回类型从Iterable[MyCaseClass]更改为Iterable[Any],这不是我想要的。例如: case class MyCaseClass(s1: String, s2: String) object MyCaseClass { def apply(sa: Array[String]) = new MyCa

我有一个数组的iterable,我正试图将其转换为case类,我正在映射它们来实现这一点。如果数组不能转换为case类,我想记录一个警告并继续映射。但是,当我实现该警告时,返回类型从Iterable[MyCaseClass]更改为Iterable[Any],这不是我想要的。例如:

case class MyCaseClass(s1: String, s2: String)
object MyCaseClass {
  def apply(sa: Array[String]) = new MyCaseClass(sa(0), sa(1))
}

val arrayIterable: Iterable[Array[String]] = Iterable(Array("a", "b"), Array("a", "b", "c"))

def badReturnType(): Iterable[Any] = { // Iterable[Any] is undesireable
  arrayIterable map {
    case sa: Array[String] if sa.length == 2 => MyCaseClass(sa)
    case _ => println("something bad happened!") // but warnings are good
  }
}

def desiredReturnType(): Iterable[MyCaseClass] = { // Iterable[MyCaseClass] is desireable
  arrayIterable map {
    case sa: Array[String] if sa.length == 2 => MyCaseClass(sa)
    // but no warnings if things go wrong!
  }
}

我想编写一个满足以下条件的函数:

映射到Iterable,将每个元素转换为MyCaseClass 获取无法转换为MyCaseClass的数组时记录警告 记录警告后,传递到匹配条件中的数组将被忽略/丢弃 返回类型应为Iterable[MyCaseClass]。 如何满足这些条件?

考虑使用列表而不是数组,并尝试将包装选项与flatMap结合使用

另一种方法是

考虑使用列表而不是数组,并尝试将包装选项与flatMap结合使用

另一种方法是


您可以这样做:

final case class MyCaseClass(s1: String, s2: String)

def parse(input: Array[String]): Either[String, MyCaseClass] = input match  {
  case Array(s1, s2) => Right(MyCaseClass(s1, s2))
  case _ => Left(s"Bad input: ${input.mkString("[", ", ", "]")}")
}

def logErrors(validated: Either[String, _]): Unit = validated match {
  case Left(error) => println(error)
  case Right(_)    => ()
}

def validateData(data: IterableOnce[Array[String]]): List[MyCaseClass] =
  data
    .iterator
    .map(parse)
    .tapEach(logErrors)
    .collect {
      case Right(value) => value
    }.toList
val arrayIterable = Iterable(Array("a", "b"), Array("a", "b", "c"))
validateData(arrayIterable)
// Bad input: [a, b, c]
// res14: List[MyCaseClass] = List(MyCaseClass("a", "b"))
您可以这样使用:

final case class MyCaseClass(s1: String, s2: String)

def parse(input: Array[String]): Either[String, MyCaseClass] = input match  {
  case Array(s1, s2) => Right(MyCaseClass(s1, s2))
  case _ => Left(s"Bad input: ${input.mkString("[", ", ", "]")}")
}

def logErrors(validated: Either[String, _]): Unit = validated match {
  case Left(error) => println(error)
  case Right(_)    => ()
}

def validateData(data: IterableOnce[Array[String]]): List[MyCaseClass] =
  data
    .iterator
    .map(parse)
    .tapEach(logErrors)
    .collect {
      case Right(value) => value
    }.toList
val arrayIterable = Iterable(Array("a", "b"), Array("a", "b", "c"))
validateData(arrayIterable)
// Bad input: [a, b, c]
// res14: List[MyCaseClass] = List(MyCaseClass("a", "b"))

您可以这样做:

final case class MyCaseClass(s1: String, s2: String)

def parse(input: Array[String]): Either[String, MyCaseClass] = input match  {
  case Array(s1, s2) => Right(MyCaseClass(s1, s2))
  case _ => Left(s"Bad input: ${input.mkString("[", ", ", "]")}")
}

def logErrors(validated: Either[String, _]): Unit = validated match {
  case Left(error) => println(error)
  case Right(_)    => ()
}

def validateData(data: IterableOnce[Array[String]]): List[MyCaseClass] =
  data
    .iterator
    .map(parse)
    .tapEach(logErrors)
    .collect {
      case Right(value) => value
    }.toList
val arrayIterable = Iterable(Array("a", "b"), Array("a", "b", "c"))
validateData(arrayIterable)
// Bad input: [a, b, c]
// res14: List[MyCaseClass] = List(MyCaseClass("a", "b"))
您可以这样使用:

final case class MyCaseClass(s1: String, s2: String)

def parse(input: Array[String]): Either[String, MyCaseClass] = input match  {
  case Array(s1, s2) => Right(MyCaseClass(s1, s2))
  case _ => Left(s"Bad input: ${input.mkString("[", ", ", "]")}")
}

def logErrors(validated: Either[String, _]): Unit = validated match {
  case Left(error) => println(error)
  case Right(_)    => ()
}

def validateData(data: IterableOnce[Array[String]]): List[MyCaseClass] =
  data
    .iterator
    .map(parse)
    .tapEach(logErrors)
    .collect {
      case Right(value) => value
    }.toList
val arrayIterable = Iterable(Array("a", "b"), Array("a", "b", "c"))
validateData(arrayIterable)
// Bad input: [a, b, c]
// res14: List[MyCaseClass] = List(MyCaseClass("a", "b"))

这个分区图看起来很好,是2.13版的新版本吗?@LuisMiguelMejíaSuárez Yeap,@LuisMiguelMejíaSuárez两个我最喜欢的主动SO应答者。这个分区图看起来很好,是2.13版的新版本吗?@LuisMiguelMejíaSuárez Yeap,@LuisMiguelMejíaSuárez两个我最喜欢的主动SO应答者。IMHO Tapech打成平局,所以我对两个答案都投了赞成票,但有人应该注意避免中间收集的好处。@som snytt有时我们甚至会比赛:IMHO Tapech平局,所以我对两个答案都投了赞成票,但有人应该注意避免中间收集的好处。@som snytt有时我们甚至会比赛: