在Scala中重构为高阶函数

时间:2013-03-27 02:12:24

标签: scala

我是Scala的新手,想知道我是否可以使用Scala对函数文字,高阶函数等的支持来以某种方式重构此代码

因为比赛和团队之间没有任何关系,我不知道这是如何可能的。我想我可以为竞争和团队添加一个包含名称属性的特性,然后就可以了。

还有其他选择吗?

class CompetitionDao extends BaseDao[Competition]{

  def retrieveAllCompetitionNames(): java.util.List[String] = {
    val competitions: java.util.List[_ <: Competition] = getDao().queryForAll()
    val competitionNames: java.util.List[String] = new ArrayList();
    for (competition <- competitions) competitionNames.add(competition.name)
    competitionNames
  } 

}

class TeamDao extends BaseDao[Team]{

  def retrieveAllTeamNames(): java.util.List[String] = {
    val teams: java.util.List[_ <: Team] = getDao().queryForAll()
    val teamNames: java.util.List[String] = new ArrayList();
    for (team <- teams) teamNames.add(team.name)
    teamNames
  }  
}

2 个答案:

答案 0 :(得分:4)

你可以引入一个trait并像恩里克建议的那样使用map

import scala.collection.JavaConversions._

trait NameRetrieval[T <: { def name: String }] { self: BaseDao[T] =>
  def retrieveAllNames = getDao.queryForAll.map(_.name)
}

然后您可以像这样使用它:

object TeamDao extends BaseDao[Team] with NameRetrieval[Team]

修改

[T <: { def name:String }]表示NameRetrieval特征可用于具有name类型String的元素的任何类型。要了解有关该标记的更多信息,请搜索“Scala结构类型”。

使用self: BaseDao[T]我说这个特性只能与BaseDao具有相同类型的T组合使用。这允许我自由使用getDao方法,因为我确信它是可用的。 Cake Pattern中使用了类似的模式,因此您可以查看该模式以获取更多信息。

答案 1 :(得分:0)

您可以尝试以下方式:

object DAO{
  def getNames: String => List[String] = { from =>
    from match {
      case "competition" => Competition.getDao().queryForAll().map(_.name)
      case "team" => Team.getDao().queryForAll().map(_.name)
    }
  }

  ...
}

调用它就像

一样简单
val temNames : List[String] = DAO.getNames("team")