有条件地调用成员函数而不使用临时var

时间:2013-04-04 22:01:03

标签: scala

我有一个表达式返回一个对象,我想只在某个布尔条件为真时才在结果对象上调用一个方法。我想在val中获得结果(无论是对象,还是在对象上调用方法的结果)。

一种方法是使用临时var,例如在下面的示例中,List(3, 1, 2)是返回对象的(可能复杂的)表达式,list是临时var,{{ 1}}是我想要有条件地调用的方法:

.sorted

这样做的规范方法是什么,也许没有使用临时变量?

请注意

import scala.util.Random

val condition = Random.nextBoolean
val result = {      
  var list = List(3, 1, 2);
  if (condition) list = list.sorted
  list
}

不太令人满意,因为if (condition) List(3, 1, 2).sorted else List(3, 1, 2) 通常可能是一个复杂的表达,我不想重复。

我发现这里有一种方法,不幸的是涉及给出显式类型(并且比上面引入临时var更长,更复杂):

List(3, 1, 2)

我怀疑必须有一种更加整洁的方式,我无法识别。

更新:一个稍微不那么难看的方法,遗憾的是仍需要明确的类型信息:

val condition = Random.nextBoolean
val result =
  (
    if (condition)
      {l: List[Int] => l.sorted}
    else
      identity(_: List[Int])
  ).apply(List(3, 1, 2))

2 个答案:

答案 0 :(得分:9)

您可以使用正向管道运算符:

implicit class PipedObject[A](value: A) {
  def |>[B](f: A => B): B = f(value)
}

scala> List(3, 1, 2) |> (xs => if (true) xs.sorted else xs)
res1: List[Int] = List(1, 2, 3)

答案 1 :(得分:1)

Scala 2.13开始,标准库现在提供了链接操作pipe,该操作可用于转换/传递具有目标函数的值,从而避免使用中间变量:

import scala.util.chaining._

List(3, 1, 2).pipe(list => if (condition) list.sorted else list)