как добавить элемент в неизменяемый массив и вернуть эту карту

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

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()      
    }
 }

Мы не рекомендуем использовать var в Scala. Как и всегда, если только в этом нет необходимости. Поэтому вместо того, чтобы пытаться получить результаты и добавить их на карту, мы создадим карту с этими записями на ходу.

1) Берем результаты и сопоставляем их с кортежем (парой) ключа и значения

2) Просто вызовите.toMap, чтобы превратить это в карту

2.1) Вы также можете сделать groupBy, который в основном группирует все эти пары по ключу, а затем вызывает.map для создания HashMap

Обратите внимание: я буду предлагать некоторые идеи, которые могут быть немного продвинуты для новичков, однако я настоятельно рекомендую уделить время ознакомлению с этими идеями, поскольку они будут вам очень полезны в будущем.

Если по какой-либо причине вам понадобится обновить эту карту в будущем, вам следует либо изучить идею композиции функций, где вы должны создать новый, обновленный экземпляр карты и передать его туда, где он должен пройти через композицию. Или, в случаях, когда абсолютно необходимо поддерживать разделяемое состояние, пожалуйста, посмотрите State Monads или cats.effect.Ref

Это решение предполагает, что resultSet является коллекцией. Однако я должен сказать, что мне очень трудно поверить в операцию с базой данных, просто возвращается. Эта операция, вероятно, должна быть заключена в IO и возвращать future, и все это должно возвращать Either или Try. Мы также не любим выбрасывать исключения в Scala. Я оставлю это вам в качестве упражнения, поскольку эти предложения выходят за рамки вопроса.

Другие вопросы по тегам