我将一个长字符串拆分为一个字符串数组,然后我想将它们全部插入到数据库中。我可以轻松地遍历数组并逐个插入,但它似乎非常低效。然后我认为有insertAll()
方法。但是,insertAll()
方法定义如下:
def insertAll(values: U*)
这只接受多个U,但不接受Array
或List
。
/* Insert a new Tag */
def insert(insertTags: Array[String])(implicit s: Session) {
var insertSeq: List[Tag] = List()
for(tag <- insertTags) {
insertSeq ++= new Tag(None, tag)
}
Tag.insertAll(insertSeq)
}
* Tag
是表格对象
这是我写的初步代码。它不起作用,因为insertAll()
没有Seq
。我希望有一种方法可以做到这一点......因此它不会生成数组长度乘以SQL插入子句。
答案 0 :(得分:7)
当函数需要重复参数(例如U *)并且您想要传递U序列时,必须将其标记为序列参数,使用: _*
完成,如
Tag.insertAll(insertSeq: _*)
这在6.6节的说明书中有所描述。它消除了一些情况,如;
def f(x: Any*)
f(Seq(1, "a"))
在那里,f可以用一个参数Seq(1, "a")
或两个,1
和"a"
来调用。它将是前者,后者用f(Seq(1,“a”):_ *)完成。 Python有类似的语法。
关于评论中的问题: 它适用于Seq,与Seq相关的集合,以及可以隐式转换为Seqs(包括Arrays)的值。这意味着很多收藏品,但不是全部。例如,不允许Set(但它们有一个toSeq方法,因此使用Set调用仍然很容易)。
它不是一种方法,它更像是一种类型的抄写。它只是告诉编译器这个参数本身是完整的预期Seq,而不是序列参数中的唯一项。