有条件地调用成员函数没有一个临时变量(Conditionally invoke member fun

2019-08-19 15:43发布

我有返回一个对象的表达式,并且我想要调用仅当某个布尔条件为真所得到的物体上的方法。 我想要得到的结果(无论是对象,或调用对象的方法的结果)在VAL。

一种方法是使用一个临时变量,如在下面的例子中,在该List(3, 1, 2)是(潜在复杂)表达返回一个对象, list是临时var和.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)

是不是很令人满意,因为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))

我猜想一定有,我没有认识到一个整洁的方式。

更新:不幸仍然需要明确的类型信息的略少丑方法:

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

Answer 1:

您可以使用去路管操作:

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)


Answer 2:

开始Scala 2.13 ,标准库现在提供链接操作pipe可用于转换/管的值与感兴趣的功能,因此避免了一个中间变量:

import scala.util.chaining._

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


文章来源: Conditionally invoke member function without a temporary var
标签: scala