我是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
}
}
答案 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")