亲们, 我最近一直在用 Scala 编写一些代码来自学这门语言,在最近的一些实验中,我使用了 an NLP library to produce a set of part-of-speech tagged words来自用户的输入。
我想写一个函数来给出句子中的第一个动词。如果没有动词,那么我想假设集合中的第一个词是动词(例如,如果玩家刚刚输入“who”或“uptime”,我的游戏将这些视为动词)。
以下是一段只有母亲才会喜欢的丑陋代码,它散发着命令式编程的味道,我想将其重构为更像惯用 Scala 的代码,最好是没有单个“if”语句的代码
def firstVerb = {
if (words.size == 1)
words.head.value
else {
val outWords = words.filter( word => word.pos == Verb)
if (outWords == Set.empty)
words.head.value
else
outWords.head.value
}
}
“words”变量的类型为 ListBuffer[EnrichedWord],其中 EnrichedWord 是我的类,它包含词性(pos,包含 Verb、Noun 等格对象)和原始单词(值)。
如果您是 Scala 天才,可以提供任何有关重构这个丑陋代码的指导,那将是非常棒的。
最佳答案
这还处理了 words
为空的情况,试一试:
words.find(_.pos == Verb).orElse(words.headOption).map(_.value).getOrElse("")
如果您确定 words
永远不会是一个空的 Set
,这个更简单:
words.find(_.pos == Verb).getOrElse(words.head).value
顺便说一句,如果您使用的是 HashSet
,那么某些元素位于第一个的概念实际上没有意义。如果每个元素代表一个句子中的一个词,它应该是一个 List
或一个 Seq
。
关于java - 地道的 Scala 列表理解 - 第一项匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9362952/