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

如果不执行其他操作,Scala和Java选项会存在

发布时间:2020-12-16 18:39:43 所属栏目:安全 来源:网络整理
导读:scala和 java中的选项是我难以理解和使用的东西.我理解它的存在是为了消除’null’处理地狱.坦率地说,我认为它引入了另一种地狱! 我在java中处理null的方法是做类似的事情: String test = null;if(test==null) // do somethingelse // do something else
scala和 java中的选项是我难以理解和使用的东西.我理解它的存在是为了消除’null’处理地狱.坦率地说,我认为它引入了另一种地狱!

我在java中处理null的方法是做类似的事情:

String test = null;
if(test==null) // do something
else  // do something else

当我切换到选项时,我正在寻求做出这种决定.

但是scala和java中的Option类中没有方法可以说,如果null执行某些操作,则执行其他操作.

如果subject为null,有一种方法可以默认值,例如

//in scala
test.getOrElse("defaulted")

我想知道为什么不能使用像我写的“pimp up”Scala选项的隐式类这样的方法

object Definitions{
  implicit class OptionExtensions[$Data](option: Option[$Data]){
    def perform (found: ($Data)=>Any,notFound: ()=>Any): Any={
      option match{
        case Some(data)=> found(data)
        case None=> notFound()
      }
    }
  }
}

请忽略名称错误的方法.但是现在写了这个,我可以使用这样的选项:

import Definitions._

val test : Option[String] = None

var builder =new StringBuilder


test.perform(builder ++= _,()=>addError("not found"))
//or
println(test.perform(_.reverse,()=>{"something else"}))

def addError(error:String)={
  println(error)
}

相反,我被迫编写匹配和案例来处理与Options有关的任何事情.我一定做错了什么.最有可能的是,我对如何使用选项的理解是有缺陷的.由于某种原因,上面的处理方式默认不在Option类中.那可能是什么原因?

解决方法

在scala中有几种方法可以实现:

> optValue.map(successFunction).getOrElse(errorFunction)
> optValue.fold(errorFunction)(successFunction)

可能你想要的是第二个,折叠.

在java中有一个.map,不确定是否有.fold,你需要看看the docs

EDIT:
As you asked to have newlines in fold,try with brackets:

Some(2).fold
  {
    println("error")
  }
  {
    value =>
      println(s"Success: $value")
  }

(编辑:李大同)

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

    推荐文章
      热点阅读