使用 if-else 中的重复代码减少代码重复

Reducing code repetition with recurring code in if-else

我想知道是否可以将以下确实显示重复的简短片段变得更干。我好像经常碰到这种结构。

假设我想要同步或异步完成一些计算,这是在运行时选择的。

for(i <- 1 to reps) {
  Thread.sleep(expDistribution.sample().toInt)
  if (async) {
    Future {
      sqlContext.sql(query).collect()
    }
  } else {
    sqlContext.sql(query).collect()
  }
}

重复调用 sqlContext 感觉很笨拙。这个琐碎的重复结构有成语吗?

您可以 "store" 在本地 def 进行计算,然后同步或异步计算它

def go = sqlContext.sql(query).collect()

if(async) Future(go) else Future.successful(go)

您可以使用 MoreExecutors.directExecutor() which is implemented in guava library 在当前线程中执行 Future

(如果您不想使用 guava 库,请参阅 this question

使用此方法,可以根据async标志切换执行上下文。

这是示例代码。

你可以看到将async标志设置为false使得每个Future都按顺序执行。

import com.google.common.util.concurrent.MoreExecutors
import scala.concurrent.{Future,ExecutionContext}
import java.lang.Thread
object Main {
  def main(args:Array[String]){
      val async = false // change this to switch sync/async
      implicit val ec = if(async){
        ExecutionContext.Implicits.global // use thread pool
      }else{
        ExecutionContext.fromExecutor(MoreExecutors.directExecutor) // directy execute in current thread
      }

      println(Thread.currentThread.getId)

      Future{
        Thread.sleep(1000)
        println(Thread.currentThread.getId)
      }
      Future{
        Thread.sleep(2000)
        println(Thread.currentThread.getId)
      }
      Thread.sleep(4000) // if you are doing asynchronously, you need this.
  }
}