Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 获取成功更新数的计数_Scala - Fatal编程技术网

Scala 获取成功更新数的计数

Scala 获取成功更新数的计数,scala,Scala,我有一个Scala函数,可以将一个条目插入MySQL数据库。我想记录成功插入的条目的数量,并将其返回给调用者。基本上,它看起来是这样的: def putInDB(lstItems: List[String]): Int = { Class.forName("com.mysql.jdbc.Driver") val dbConn = DriverManager.getConnection("jdbc:mysql://localhost/somedb?" "user=someuser&

我有一个Scala函数,可以将一个条目插入MySQL数据库。我想记录成功插入的条目的数量,并将其返回给调用者。基本上,它看起来是这样的:

def putInDB(lstItems: List[String]): Int = {
  Class.forName("com.mysql.jdbc.Driver")
  val dbConn = DriverManager.getConnection("jdbc:mysql://localhost/somedb?" "user=someuser&password=somepass")
  val stmt = dbConn.createStatement
  var insertCount = 0 //Not sure if this is the right way
  lstItems.foreach { l =>
    val res = stmt.executeUpdate("insert ignore into mytable ... ")
    if (res > 0) insertCount = insertCount + 1  // Nor this
  }
  insertCount
}
我不确定
var insertCount
和我在循环中更新变量的方式是否正确。我的函数编程技能有些生疏;如果我想以“功能性”的方式进行计数,那么维护计数的正确方法是什么?i、 例如,使用不可变变量并避免使用我使用过的
if
语句。

试试这个(假设executeUpdate总是返回0或1):

实际上,最好是:

lstItems.map(stmt.executeUpdate).count(_ > 0)
我想说:

val count =  lstItems.foldLeft(0) { (sum, item) => 
    val res = stmt.executeUpdate("insert ignore into mytable ... ")
    if (res > 0 ) sum + 1
    else sum
  }

lstItems.map(l=>stmt.executeUpdate(“…”).sum
?:)不是更容易吗我不知道
executeUpdate
返回的确切内容,但我假设它是“受影响的行”。是的,这正是Shadowlands建议的。executeUpdate返回0或1,但在某些情况下它也返回-1
语句。executeUpdate
返回一个行计数,因此它可能大于1,因此您的第二个选择是正确的。感谢您的回答,但是
if then else
块仍然让我感到奇怪。我更喜欢Shadowlands的答案。请注意,
foldleft
只遍历列表一次,而
map.count
解决方案会执行两次(第一次使用
map
创建中间列表,然后使用
count
),以防效率受到影响。嗯,这是一个非常有效的观点。谢谢,我会记住的。我目前只期望不超过1000个条目(最坏的情况),所以如果这成为一个问题,我将尝试一下!)
val count =  lstItems.foldLeft(0) { (sum, item) => 
    val res = stmt.executeUpdate("insert ignore into mytable ... ")
    if (res > 0 ) sum + 1
    else sum
  }