我必须在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]
(如果找不到则返回空白)
答案 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}