遍历列表以调用不同的功能

时间:2019-06-17 22:27:39

标签: scala gatling

我有一个整数列表,需要遍历该列表并调用具有相同输入参数的不同函数,这是我的代码:

  def callRandomFunctions(config: config, prefix: String): ChainBuilder = {
    val randomList = Random.shuffle(List(1, 2, 3, 4))
    randomList.foreach { _ =>
      _ match {
        case 1 => func1(config, prefix)
        case 2 => func2(config, prefix)
        case 3 => func3(config, prefix)
        case 4 => func4(config, prefix)
      }
    }
  }

 def func1(config: config, prefix: String): ChainBuilder = {...}
 def func2(config: config, prefix: String): ChainBuilder = {...}
 def func3(config: config, prefix: String): ChainBuilder = {...}
 def func4(config: config, prefix: String): ChainBuilder = {...} 

并出现以下错误:

missing parameter type for expanded function
[error] The argument types of an anonymous function must be fully known. (SLS 8.5)
[error] Expected type was: ?
[error]         _ match {
[error]         ^


[error] type mismatch;
[error]  found   : Unit
[error]  required: io.gatling.core.structure.ChainBuilder
[error]     randomList.foreach {
[error]                        ^
[error] two errors found

4 个答案:

答案 0 :(得分:6)

只需对函数进行随机组合,然后直接调用它们即可。

def func1(config: config, prefix: String): ChainBuilder = ???
def func2(config: config, prefix: String): ChainBuilder = ???
def func3(config: config, prefix: String): ChainBuilder = ???
def func4(config: config, prefix: String): ChainBuilder = ???

def callRandomFunctions(config: config, prefix: String): Seq[ChainBuilder] =
  Random.shuffle(Seq(func1 _, func2 _, func3 _, func4 _))
        .map(_(config, prefix))

答案 1 :(得分:3)

您可以简单地执行以下操作:

randomList.foreach {
    case 1 => func1(config, prefix)
    case 2 => func2(config, prefix)
    case 3 => func3(config, prefix)
    case 4 => func4(config, prefix)
}

,它将用作与传递给foreach回调的号码匹配的模式。

您的代码的另一个问题是,您想从ChainBuilder返回callRandomFunctions,但是您正在使用foreach,这将终止运算符返回Unit。您可能想使用map并将返回类型更改为List[ChainBuilder]

def callRandomFunctions(config: Config, prefix: String): List[ChainBuilder] = {
    val randomList = Random.shuffle(List(1, 2, 3, 4))
    randomList.map {
        case 1 => func1(config, prefix)
        case 2 => func2(config, prefix)
        case 3 => func3(config, prefix)
        case 4 => func4(config, prefix)
    }
}

答案 2 :(得分:2)

获得更灵活的解决方案

def callRandomFunctions(config: config, prefix: String): ChainBuilder = {
  val randomList = Random.shuffle(List(1, 2, 3, 4))

  exec(session => session.set("randomList")
  .forEach("${randomList}", "currentVal") {
    doSwitch("${currentVal}") (
       1 -> exec(func1(config: config, prefix: String)),
       2 -> exec(func2(config: config, prefix: String)),
       3 -> exec(func3(config: config, prefix: String)),
       4 -> exec(func4(config: config, prefix: String))
    )
  } 

如果执行顺序实际上并不需要是随机的,则还可以使用.roundRobinSwitch

答案 3 :(得分:1)

您可以使用反射的名称来执行该函数(尽管性能不是很好)。 您不需要模式匹配,这只是另一种实现方式:

您需要将所有函数放在特定的类中

case class FunctionsClass(config: config, prefix: String) {
  def func1(config: config, prefix: String): ChainBuilder = ???
  def func2(config: config, prefix: String): ChainBuilder = ???
  def func3(config: config, prefix: String): ChainBuilder = ???
  def func4(config: config, prefix: String): ChainBuilder = ???
}

然后,像这样实现callRandomFunctions

def callRandomFunctions(config: config, prefix: String):Unit = {
  val args = List(config, prefix)
  val argtypes = args.map(_.getClass)
  val functionsClassObj = FunctionsClass(config, prefix)
  val randomList = Random.shuffle(List(1, 2, 3, 4))

  val result = randomList.map{ i =>     
      val mtd = functionsClassObj.getClass.getMethod(s"func$i", argtypes: _*)
      Try {mtd.invoke(functionsClassObj, args: _*)}.recover { case _ => println("ERROR")}
  }

  result.filter(_.isSuccess).map(_.get))
}

通过这种方式,您可以根据随机列表中的ID调用func方法