0

我是 Scala 的新手,想知道是否可以使用 Scala 对函数文字、高阶函数等的支持来重构这段代码

因为比赛和团队之间没有关系,我不明白这怎么可能。我想我可以为 Competition and Team 添加一个包含 name 属性的特征,这样就可以了。

还有其他选择吗?

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
  }  
}
4

2 回答 2

4

您可以像 Enrique 建议的那样引入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特征可用于具有称为 type 的元素的任何name类型String。要了解有关该符号的更多信息,请搜索“Scala 结构类型”。

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

于 2013-03-27T07:32:22.480 回答
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")
于 2013-03-27T07:20:24.647 回答