我有一个类似以下的列表:
val map_temp =
List(
(List("SRC_123","SRC_999"),"TRGT_123"),
(List("SRC_456"),"TRGT_456"),
(List("SRC_789"),"TRGT_789"),
(List("SRC_888"),"TRGT_888"),
)
我想检查其中是否存在SRC_999
。
我尝试了以下操作:
map_temp.foreach {
case(key, value) =>
if (key.contains("SRC_999")) {
print("yes exists")
}
}
这将导致以下错误
error: value contains is not a member of Any
case(key:Any, value) => if(key.contains("SRC_99"))
我也尝试过这个:
map_temp.foreach(a => if(a._1.contains("SRC_999")))
但是这会导致以下错误:
error: value contains is not a member of Any
mapped.foreach(a => print(a._1.contains("SRC_999")))
我该如何解决?
我该如何解决?
没有List[Any]
。
通过具有List[Any]
,您明确地告诉Scala元素可能是anything。这意味着Scala对元素一无所知。它甚至不知道他们是否具有contains
方法。元素可以是整数,例如,没有contains
方法。
map_temp
的值为List[(List[String], String)]
,而不是List[Any]
。您可以像这样检查要查找的元素:
map_temp.exists(_._1.contains("SRC_999"))
这应该做您想要的:
val map_temp =
List(
(List("SRC_123","SRC_999"),"TRGT_123"),
(List("SRC_456"),"TRGT_456"),
(List("SRC_789"),"TRGT_789"),
(List("SRC_888"),"TRGT_888"),
)
def exists[A](input: List[(List[A], _)], what: A): Boolean =
input.exists(_._1.contains(what))
// should be found
assert(exists(map_temp, "SRC_999"))
assert(exists(map_temp, "SRC_888"))
// should not be found
assert(!exists(map_temp, "SRC_998"))
assert(!exists(map_temp, "TRGT_123"))
我认为您实际上没有List[Any]
开头。看来您正在经历几个类型错误,这些错误可能会让您误以为是。您的map_temp
是List[(List[String], String)]
。
如果不是这种情况,并且您由于某种原因从某个返回map_temp
的方法中获取了List[Any]
,那么如果您控制该方法,则可以对其进行更改以反映实际的类型。如果不能这样做,即使它不安全,也可以尝试对其进行投射。
只需进行少量更改,您还可以检索项目:
def find[A, B](input: List[(List[A], B)], what: A): Option[B] =
input.find(_._1.contains(what)).map(_._2)
// should be found
assert(find(map_temp, "SRC_999") == Some("TRGT_123"))
assert(find(map_temp, "SRC_888") == Some("TRGT_888"))
// should not be found
assert(find(map_temp, "SRC_998") == None)
assert(find(map_temp, "TRGT_123") == None)
您可以使用此代码here on Scastie来玩耍。