【发布时间】:2020-08-26 17:02:07
【问题描述】:
我编写了类似于下面给出的代码。它按照(有点令人困惑的)要求工作,但有些东西告诉我它可以在 Scala 中使用“模式匹配”或类似的东西以不同的方式编写,以使其看起来更具功能。有什么建议吗?
def xyzMethod(map: util.HashMap[Any, List[SomeObject]]) : Option[xyzObject] = {
var myObject: Option[xyzObject] = None
val cCount: Int = map.get("c").size
if (cCount != 10) {
val bCount: Int = map.get("b").size
if (bCount + cCount == 20) {
myObject = buildXyz("b")
} else {
val aCount: Int = map.get("a").size
if (aCount != 0) {
val dCount: Int = map.get("d").size
if (dCount > 10) {
myObject = buildXyz("a")
}
}
}
}
myObject
}
根据要求,这里有一些测试用例:
Test Case 1:
map =>
"c" => Objectc1, Objectc2... Objectc10
This should return None
-----------
Test Case 2:
map =>
"c" => Objectc1, Objectc2
"b" => Objectb1, Objectb2..... Objectb18
This should return buildXyz("b")
-----------
Test Case 3:
map =>
"c" => Objectc1
"b" => Objectb1, Objectb2
This should return None
-----------
Test Case 4:
map =>
"c" => Objectc1
"b" => Objectb1, Objectb2
"a" => Objecta1
"d" => Objectd1
This should return None
-----------
Test Case 5:
map =>
"c" => Objectc1
"b" => Objectb1, Objectb2
"a" => Objecta1
"d" => Objectd1, Objectd2......Objectd10, Objectd11
This should return buildXyz("a")
【问题讨论】:
-
是的,谁告诉过你这是正确的,但这并不意味着我们不应该使用 if else,如果没有匹配的情况,使用 if 语句完全可以。不建议使用 var ,因此您可能需要摆脱它。你想在哪个字段上进行模式匹配,因为我可以看到你的方法不带任何参数,你有任何全局变量吗?
-
是的,map 是一个全局变量。它不必是全球性的。不确定您所说的“是的,谁曾经告诉过您这是正确的”。在这种情况下,我将如何摆脱“var”?无论如何,编码示例会很棒!
-
您到底想做什么?您想检查值的长度您的地图类型是什么,请相应地更新问题没有足够的信息。
-
map 的类型为:map: util.HashMap[Any, List[SomeObject]] 所以 .get().size 将返回列表中的条目数。无论如何,为方法添加了参数以使其更清晰。
-
.get("d").size确实不返回List中的条目数。如果只访问键a、b、c和d,为什么感兴趣的键值对的数量是多少?
标签: scala scalastyle