java - 地道的 Scala 列表理解 - 第一项匹配

标签 java scala list-comprehension idioms

亲们, 我最近一直在用 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/

相关文章:

xml - 在 Scala 中解析不带引号的 XML

haskell - 枚举整数的所有有限序列?

java - 当我们有多个实现类时,依赖注入(inject)有何帮助?

java - Jsp 自定义标签以错误的顺序替换为 html 内容

scala - 字段中的空值会生成 MatchError

scala - def 是否被视为 Scala 中的闭包?

python - 是否有 "Pythonic"方法来创建包含条件项的列表?

python - 使用理解得到两个值

c# - Java 中的 DataTable 等效项

java - jsp中的表单发布,contentType header没有字符集,为什么?