首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala高阶函数

Scala高阶函数
EN

Stack Overflow用户
提问于 2018-09-04 09:01:07
回答 1查看 81关注 0票数 0

我想把函数作为类构造的参数。我想在课堂上计算一些函数(某种懒惰的计算)。

代码语言:javascript
复制
class Foo(calc: PGSimpleDataSource => Connection => PreparedStatement => ResultSet => Option[A] ??? ) {

  here some logic like:

  def runCalc = calc ( resultSet ( preparedStatement ( connection )

  resultSet.close()
  preparedStatement.close()
  connection.close()

  send result somewhere ...

}

准备一些功能

代码语言:javascript
复制
implicit val dataSource: PGSimpleDataSource = Service.ds

implicit def getConnection(implicit ds: PGSimpleDataSource): Connection = ds.getConnection

implicit def getPreparedStatement(userId: UUID)(implicit con: Connection): PreparedStatement ={
    val st = con.prepareStatement("SELECT * FROM bar WHERE id = CAST(? as UUID)")
    st.setString(1, id.toString)
    st
  }

implicit def getResultSet(implicit ps: PreparedStatement): ResultSet = ps.executeQuery()

implicit def mapping(implicit rs: ResultSet): Option[Bar] = {
    Iterator.continually(rs.next)
      .takeWhile(identity)
      .map(_ => Bar(UUID.fromString(rs.getString(1)))).toList.headOption
  }

然后是一些功能,比如:

代码语言:javascript
复制
def getInstance(id: UUID) = new Foo(???)

val foo = getInstance(id)

foo.runCalc()

有可能吗?请帮帮忙

upd:

我试着这样做我的课:

代码语言:javascript
复制
class Foo[A](
                con: => Connection,
                ps: => PreparedStatement,
                rs: => ResultSet,
                mapping: => Option[A],
                calc: Connection => PreparedStatement => ResultSet => Option[A]
              ) {
  def run(): Unit = {
    val result: Option[A] = calc(con)(ps)(rs)(mapping)

    rs.close()
    ps.close()
    con.close()
  }
}

但是我不明白怎么写下面写的"f“函数

它需要do映射( getResultSet (id,getConnection))

换句话说,映射需要ResultSet,需要需要Id和连接的PreparedStatement

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-04 09:15:12

你可以的。它会看起来像这样

代码语言:javascript
复制
case class Foo(calc: String => String => String => Option[String]) {
  def run = {
    val p1 = "p1"
    val p2 = "p2"
    val p3 = "p3"

    calc(p1)(p2)(p3)
  }
}

使用实例

代码语言:javascript
复制
object App extends App {
  val f = (x: String) => (y: String) => (z: String) => {
    Option(x + y + z)
  }
  val foo = Foo(f)
  println(foo.run)
}

或者你可以使用跑动

代码语言:javascript
复制
object App extends App {
  val f = (x: String, y: String, z: String) => {
    Option(x + y + z)
  }

  val foo = Foo(f.curried)

  println(foo.run)
}

编辑

对于你扩展的问题,我可以提出这门课:

代码语言:javascript
复制
case class Foo[A](
                   getConnection: () => Connection,
                   getStatement: Connection => PreparedStatement,
                   getResultSet: PreparedStatement => ResultSet,
                   mapping: ResultSet => Option[A]) {
  def run(): Option[A] = {
    val connection = getConnection()
    try{
      val statement = getStatement(connection)
      try{
        val resultSet = getResultSet(statement)
        try{
          mapping(resultSet)
        }finally {
          resultSet.close()
        }
      }finally{
        statement.close()
      } 
    } finally {
      connection.close()
    }
  }
}

用法示例:

代码语言:javascript
复制
  val foo = Foo(
    () => new Connection(),
    connection => new PreparedStatement(),
    statement => new ResultSet(),
    resultSet => Option("")
  )

所有这些函数都具有上一步的参数,因此,例如,当您创建ResultSet时,您可以使用statement (但不能使用connection)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52162591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档