Scala中高阶函数的重构

Scala中高阶函数的重构,scala,Scala,我是Scala新手,不知道是否可以使用Scala对函数文本、高阶函数等的支持来重构代码 因为一场比赛和一支球队之间没有关系,我不明白这怎么可能。我想我可以在比赛和团队中添加一个特性,包括名称属性,然后这就成为可能 还有其他选择吗 class CompetitionDao extends BaseDao[Competition]{ def retrieveAllCompetitionNames(): java.util.List[String] = { val competition

我是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
  }  
}
班级竞赛DAO扩展BaseDao[竞赛]{
def retrieveAllCompetitionNames():java.util.List[字符串]={

val:java.util.List[\p>您可以尝试以下方法:

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")

您可以尝试以下方法:

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")

你可以引入一个
特征
,并像恩里克建议的那样使用
映射

import scala.collection.JavaConversions._

trait NameRetrieval[T <: { def name: String }] { self: BaseDao[T] =>
  def retrieveAllNames = getDao.queryForAll.map(_.name)
}
编辑
[T你可以引入一种
特质
并使用
地图
,就像恩里克建议的那样:

import scala.collection.JavaConversions._

trait NameRetrieval[T <: { def name: String }] { self: BaseDao[T] =>
  def retrieveAllNames = getDao.queryForAll.map(_.name)
}
编辑
[T def retrieveAllXNames=getDao().queryForAll().map(yForall.name)如何?不确定是否有效,只是尝试了一下。这里缺少很多代码。
getDao().quaryForAll()是什么
?很难理解您想要实现什么,但我同意Enrique的观点,这应该是一个带有本机Scala集合的单行程序。此外,您可以通过导入Scala.collection.JavaConversions在Scala和Java集合之间自动转换。\uu
。def retrieveAllXNames=getDao().queryForAll().map(\ux.name)如何?不确定是否有效,只是尝试了一下这里缺少很多代码。什么是
getDao().quaryForAll()
?很难理解您想要实现什么,但我同意Enrique的观点,这应该是一个与本机Scala集合的单行程序。此外,您可以通过导入Scala.collection.JavaConversions在Scala和Java集合之间自动转换。\u
。这非常优雅,我喜欢。您可以添加一些关于什么的信息吗{def name:String}做什么或需要它做什么?对self也是如此variable@DJ180您需要搜索的术语是“结构类型”。这里的意思是“任何具有返回字符串的
name
方法的T”。
self
是“self-type”,这意味着trait只能混合到指定的类型中,从而使该类型的成员可用。此外,
JavaConversions
是半不推荐使用的:使用
JavaConversions
,尽管如果您实际上试图返回
java.util.List
请注意,此答案使用Scala集合,因此这两种方法都不使用会更有效。这很优雅,我喜欢。你能添加一些关于{def name:String}做什么或它需要什么的信息吗?对self也是这样variable@DJ180您需要搜索的术语是“structural type”。这里它的意思是“任何具有返回字符串的
name
方法的T”。
self
是一个“自我类型",这意味着trait只能混合到指定的类型中,从而使该类型的成员可用。此外,
JavaConversions
是半不推荐使用的:使用
JavaConversions
,尽管如果您实际上试图返回
java.util.List
请注意,此答案使用Scala集合,因此两者都不使用会更有效。