Scala:部分应用的功能

时间:2013-05-27 18:57:38

标签: scala

我对Scala比较陌生,只是试着让我解决使用部分应用的函数来解决我的问题。

我的问题是,在我的代码中,我在多个地方都有以下foreach逻辑:

for (teamType <- TeamType.allTypes) {
  findViewById(teamType.layoutID).findViewById(buttonID)
    .setOnClickListener(matchButtonOnClickListener)
}

再来一次:

for (teamType <- TeamType.allTypes) refreshTeamStatisticViews(teamType)

基本上,对于TeamType案例对象中的每个teamType,我希望执行一个返回Unit的函数

我想要做的是将foreach部分移动到TeamType案例对象中,然后使用函数或部分应用函数返回Unit。

例如,TeamType将包含以下内容:

def forAllTeamTypes(fun: TeamType => Unit) = for(teamType <- allTypes) fun(teamType) 

对于上面的第二个例子,我可以将其改为

TeamType.forAllTeamTypes(refreshTeamStatisticViews)

但是,我不确定如何将此应用于部分应用的函数以用于更复杂的第一个示例。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

简短回答:

TeamType.forAllTeamTypes{ teamType =>
  findViewById(teamType.layoutID).findViewById(buttonID).setOnClickListener(matchButtonOnClickListener)
}

让我们来看看你的代码:

for (teamType <- TeamType.allTypes) {
  findViewById(teamType.layoutID).findViewById(buttonID).setOnClickListener(matchButtonOnClickListener)
}

actually means这个:

TeamType.allTypes.foreach{ teamType =>
  findViewById(teamType.layoutID).findViewById(buttonID).setOnClickListener(matchButtonOnClickListener)
}

foreach方法将TeamType => Unit作为参数,就像您的方法forAllTeamTypes一样。

答案 1 :(得分:1)

使用内置函数可能会更好。似乎.foreach已经拥有了你想要的签名。

它看起来像:

TeamType.allTypes.foreach (functionOfYourChoosing)