【问题标题】:how to add element to immutable array and return that map如何将元素添加到不可变数组并返回该映射
【发布时间】:2020-03-01 23:31:01
【问题描述】:
def jdbcReader(user: String, pwd: String, url: String, id: Int): List[mutable.Map[String, String] = {
   var KeyVal = mutable.Map[String, String]()

   var connection: Connection = null
   try {

      connection = DriverManager.getConnection(url, user, pwd)
      val statement = connection.createStatement()
      val resultSet = statement.executeQuery("SELECT Nam, Value FROM tablename WHERE id=?".replace("?", id.toString))
      while (resultSet.next()) {
         val name = resultSet.getString("Nam")
         val value = resultSet.getString("Value")
         // println("name , value = " + name + ", " + value)
      }

   } catch {
      case e => e.printStackTrace()
         val t = e.getMessage()
   }
}

如何将元素添加到地图列表并从此方法返回?我相信你已经知道我是 Scala 的新手

【问题讨论】:

  • 您能否准确说明您要添加到此列表中的内容?一张空地图?
  • 试图将键值对字符串添加到列表映射
  • 你有一个地图列表而不是列表地图。我当然也不明白您为什么要返回 Map 列表。一个简单的地图就足够了,不是吗?
  • var KeyVal =mutable.Map[String, String] var connection:Connection = null tr​​y { val name = resultSet.getString("Nam") val value = resultSet.getString("Value") KeyVal += (name -> value) } } catch { case e => e.printStackTrace() val t =e.getMessage() } }
  • 当我添加一个元素 KeyVal += (name -> value) 时,它不断抛出类型不匹配

标签: scala jdbc mutablemap


【解决方案1】:

代码有很多导致清晰度问题的问题,但我会尽我所能回答您的问题。

def jdbcReader(user:String,pwd:String, url: String, id:Int): Map[String, String] ={

   try {

      val connection = DriverManager.getConnection(url, user, pwd)
      val statement = connection.createStatement()
      val resultSet = statement.executeQuery(s"SELECT Nam, Value FROM tablename WHERE id=${id.toString}")


      resultSet.map(e => (e.getString("Name"), e.getString("Value")).toMap

       //Or if you want a hashmap
       // resultSet.map(e=>(e.getString("Name"), e.getString("Value")).groupBy(_._1).map { case (k,v) => (k,v.map(_._2))}


   } catch {
     case e : Exception => 
       e.printStackTrace()
       val t = e.getMessage()      
    }
 }

我们不建议在 Scala 中使用 var。像以往一样,除非你真的,真的必须这样做。因此,我们不会尝试获取结果并将它们添加到地图中,而是会在旅途中构建一个包含这些条目的地图。

1) 我们获取结果并将它们映射到键和值的元组(对)

2) 只需调用 .toMap 即可将其转换为 Map

2.1)你也可以做一个groupBy,基本上把所有这些pairs按key分组,然后调用.map构造一个HashMap

请注意,我会建议一些对新手来说可能稍微先进的想法,但是我强烈建议您花时间熟悉这些想法,因为它们将来会对您有很大帮助

如果您将来出于任何原因需要更新此 Map,您应该研究 function composition 的想法,您将在其中构造一个 新的、更新的 Map 实例并通过它到任何需要通过组合的地方。 或者,在绝对必须保持共享状态的情况下,请查看State Monadscats.effect.Ref

此解决方案假定 resultSet 是一个集合。但是我不得不说,我很难相信一个数据库操作,只是返回。该操作可能应该包含在一个 IO 中并返回一个未来,整个事情应该返回一个 Either 或 Try。我们也不喜欢在 Scala 中抛出异常。我将把这些作为练习留给你,因为这些建议超出了问题的范围。

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2017-11-25
    • 2014-03-14
    • 2012-02-22
    • 2019-05-03
    • 2018-10-01
    相关资源
    最近更新 更多