Scala:对可能返回空列表的yield的类型检查

时间:2017-01-31 08:52:38

标签: scala

我必须在Scala中使用代码,这意味着返回句子。

val x: List[Word] = for (word <- words) yield {
  if (word.isLegit()) sentenceStartingWith(word)
}

我收到错误,因为x的类型不是List[word]而是Any(因为它可能不会产生任何结果)。施法没有帮助。

想到的简单修复是

val x: List[Word] = for (word <- words) yield {
  if (word.isLegit()) sentenceStartingWith(word)
  else List[Word]()
}

但是这会返回一个列表,其中包含许多空列表作为成员。如何获得我想要的行为,即如果找到则返回包含所有项目的List[word](如果找不到则返回空白)

2 个答案:

答案 0 :(得分:7)

  

我收到错误,因为x的类型不是List [word]而是Any

编译器正在推断你要做的事情。它看到的是您只在匹配List[Any]语句时返回一个值,因此它会隐式返回List.canBuildFrom[Any](通过Seq[Any])以查找与谓词不匹配的任何内容。因此,val x: List[Word] = for (word <- words if word.isLegit()) yield sentenceStartingWith(word) 的常见超类型。

这样做的一种可能方法是使用警卫首先过滤掉单词:

val x = words.withFilter(_.isLegit()).map(word => sentenceStartingWith(word))

这相当于:

{{1}}

Scala中的注意方法是camelCase,类名是PascalCase。

答案 1 :(得分:2)

试试这个

  val x: List[word] = for (word <- words  if (word.isLegit())) yield {word}