我有以下Scala代码。它通过调用isKeywordInTopicTitle(keyword)来过滤HashMap的(k,v)值。 这与单词列表进行比较,检查wordList中的任何一个是否包含"包含#34;。
val hashWithSearchKeywords = readlinks.values.filter(isKeywordInTopicTitle(_))
[snip]
def isKeywordInTopicTitle(keyword: String): Boolean = {
val wordList = List("engine", "deluxe", "motor", "VW", "EMPI")
(wordList.foldLeft(false)( _ || keyword.contains(_) ))
}
是否有更有效的方法(对于不是专家的功能程序员来说,这是可读/可理解的)? :O)
由于
数。
答案 0 :(得分:4)
好吧,我猜那行
(wordList.foldLeft(false)( _ || keyword.contains(_) ))
您可以将其重写为
wordList exists keyword.contains
后者更具可读性。
答案 1 :(得分:1)
考虑在collect
上使用HashMap
,这会产生简洁的代码,就像这样,
val hashWithSearchKeywords = readlinks.collect {
case m@(k, v) if wordList.contains(v) => m
}
这会提供符合条件的地图(key,value)
对(即(m._1,m._2)
)。
<强>更新强>
更多关于简明代码的附带评论,请考虑val wl = wordList.toSet
,因此
val hashWithSearchKeywords = readlinks.collect { case m@(k, v) if wl(v) => m }
答案 2 :(得分:0)
其他答案解决了一些可读性问题。我只是添加一个,只要你为Set
使用原生HashSet
或wordList
,那么效率就不会高得多。 HashSet
确保O(1)查找。