使用 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.
}
}
我想知道是否可以将以下确实显示重复的简短片段变得更干。我好像经常碰到这种结构。
假设我想要同步或异步完成一些计算,这是在运行时选择的。
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.
}
}