加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:20:08 所属栏目:安全 来源:网络整理
导读:我有一个表达式返回一个对象,我想只在某个布尔条件为真时才在结果对象上调用一个方法.我想在val中获得结果(无论是对象,还是在对象上调用方法的结果). 一种方法是使用临时var,例如在下面的示例中,List(3,1,2)是返回对象的(可能复杂的)表达式,list是临时var,而
我有一个表达式返回一个对象,我想只在某个布尔条件为真时才在结果对象上调用一个方法.我想在val中获得结果(无论是对象,还是在对象上调用方法的结果).

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

import scala.util.Random

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

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

注意

if (condition) List(3,2).sorted else List(3,2)

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

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

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

我怀疑必须有一种我没有认识到的更整洁的方式.

更新:一个稍微不那么丑陋的方法,遗憾的是仍然需要显式的类型信息:

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

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读