java – 惯用的Scala列表理解 – 匹配的第一个项目
发布时间:2020-12-15 00:38:26 所属栏目:Java 来源:网络整理
导读:伙计们, 我最近在 Scala中编写了一些代码来自学语言,在最近的一些实验中,我从用户的输入中使用了 an NLP library to produce a set of part-of-speech tagged words. 我想写一个函数,它给出了句子中的第一个动词.如果没有动词,那么我想假设该集合中的第一个
伙计们,
我最近在 Scala中编写了一些代码来自学语言,在最近的一些实验中,我从用户的输入中使用了 an NLP library to produce a set of part-of-speech tagged words. 我想写一个函数,它给出了句子中的第一个动词.如果没有动词,那么我想假设该集合中的第一个单词是动词(例如,如果玩家只输入“谁”或“正常运行时间”,那些被我的游戏视为动词). 以下是一个代码块,只有母亲才会喜欢它,并且它对命令式编程感到厌恶,我想把它重构成更像是惯用语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 geniuses在重构这个对接丑陋的代码时可以提供的任何指导都很棒. 解决方法
这另外处理单词为空时的情况,尝试:
words.find(_.pos == Verb).orElse(words.headOption).map(_.value).getOrElse("") 如果你确定单词永远不会是空集,那么这个单词更简单: words.find(_.pos == Verb).getOrElse(words.head).value 顺便说一下,如果你使用的是HashSet,那么首先要考虑某个元素的概念并不合理.如果每个元素代表一个单词,它应该是一个List或一个Seq. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |