Kev*_*man 7 java scala list-comprehension idiomatic
伙计们,我最近在Scala中编写了一些代码来自学语言,在最近的一些实验中,我使用NLP库从用户的输入中生成一组词性标记的单词.
我想写一个函数,它给出了句子中的第一个动词.如果没有动词,那么我想假设该组中的第一个单词是动词(例如,如果玩家只输入"谁"或"正常运行时间",那些被我的游戏视为动词).
以下是一个代码块,只有母亲才会喜欢这么难看,而且命令式编程很糟糕,我想把它重构成更像是惯用的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
}
}
Run Code Online (Sandbox Code Playgroud)
"words"变量的类型为ListBuffer [EnrichedWord],其中EnrichedWord是我的类,它包含一个词性(pos,包含案例对象,如Verb,Noun等)和原始词(value).
Scala geniuses在重构这个对接丑陋的代码时可以提供的任何指导都很棒.
这另外处理words空的情况,尝试它:
words.find(_.pos == Verb).orElse(words.headOption).map(_.value).getOrElse("")
Run Code Online (Sandbox Code Playgroud)
如果你确定words永远不会是空的Set,那么这个更简单:
words.find(_.pos == Verb).getOrElse(words.head).value
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果你使用HashSet某些元素的概念首先没有意义.如果每个元素代表一个单词,它应该是a List或a Seq.
| 归档时间: |
|
| 查看次数: |
4243 次 |
| 最近记录: |