我有一个表达式返回一个对象,我想只在某个布尔条件为真时才在结果对象上调用一个方法。我想在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))
答案 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)