如何为迭代创建可重用的模块,使我能够:
- 选择是否并行迭代
- 让我指定需要执行任务的高级功能
这里有一些虚拟功能。它们本身构成了问题的第二部分:
我是否应该在这里有一个接口,使这些功能中的每一个至少实现参数inputDay:String
?
还是具有带有配置类的通用函数更好,该配置类在其中实现了最小的接口?
def doStuff(inputDay: String,inputConfigSomething: String): Unit = println(inputDay + inputConfigSomething)
def doOtherStuff(inputDay: String): Unit = println(inputDay)
下面是迭代模块的一个示例,其中具体说明了所执行任务的具体实现:
val days = Seq("20190101","20190102","20190103")
val something = "foo"
def iteration(d: Seq[String],parallel: Boolean = false) = {
if (parallel) {
d.par.foreach(dd => {
println(dd)
})
} else {
d.foreach(dd => {
println(dd)
})
}
}
iteration(days)
现在,第二,代替具体的实现,应该可以传递一个高阶函数来控制计算结果。 很遗憾,下面的代码尚未编译。
def iterationmodule(d: Seq[String],functionToApply: Function,parallel: Boolean = false) = {
if (parallel) {
d.par.foreach(dd => {
functionToApply(dd)
})
} else {
d.foreach(dd => {
functionToApply(dd)
})
}
}
iterationmodule(days,doStuff)
尝试使用更通用的实现。这似乎太令人费解了。必须有一个更简单的方法。也, 它仍然无法编译,因为我无法在迭代模块中动态实例化C。而且,一次又一次键入一些C和F也很烦人。
trait MinimalIterationParameters {
def inputDay: String
}
trait FunctionParameters
trait OperationService[C <: MinimalIterationParameters,F <: FunctionParameters] {
def doOperation(config: C,functionParameter: F): Unit
}
case class Minimal(override val inputDay: String) extends MinimalIterationParameters
case class ExtendedThing(inputConfigSomething: String) extends FunctionParameters
object MyDummyoperationService extends OperationService[Minimal,ExtendedThing] {
override def doOperation(config: Minimal,functionParameter: ExtendedThing): Unit = {
println(config.inputDay + functionParameter.inputConfigSomething)
}
}
def iterationmoduleGeneric[C <: MinimalIterationParameters,F <: FunctionParameters](d: Seq[String],functionToApply: OperationService[C,F],f: F,parallel: Boolean = false) = {
if (parallel) {
d.par.foreach(dd => {
functionToApply.doOperation(C(dd),f)
})
} else {
d.foreach(dd => {
functionToApply.doOperation(C(dd),f)
})
}
}
val c = Minimal
iterationmoduleGeneric[Minimal,ExtendedThing](days,MyDummyoperationService,f = ExtendedThing("foo"))
编辑
看到第一个答案之后。确实,这要简单得多。因此已经向前迈出了一大步。 但是,我需要能够将迭代项作为参数传递给函数
def iterationmodule[A](d: Seq[A],functionToApply: A => Any,parallel: Boolean = false): Unit =
if (parallel) {
d.par.foreach(functionToApply)
}
else {
d.foreach(functionToApply)
}
def doStuff(inputDay: String,inputConfigSomething: String): Unit = println(inputDay + inputConfigSomething)
iterationmodule[String](days,doStuff(d_each_reference,"foo"))
但是:
iterationmodule[String](days,"foo"))
显然不会编译,因为d_each_reference
在那里没有定义。如何访问当前迭代的项目并将其传递给函数?
此外,尝试传递扁平化的迭代项和配置视图:
val configForIteration = days.map(d=> (d,something))
iterationmodule[(String,String)](configForIteration,doStuff)
无法编译。