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

set*_*thu 6 java scala optional

scala和java中的选项是我难以理解和使用的东西.我理解它的存在是为了消除'null'处理地狱.坦率地说,我认为它引入了另一种地狱!

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

String test = null;
if(test==null) // do something
else  // do something else
Run Code Online (Sandbox Code Playgroud)

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

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

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

//in scala
test.getOrElse("defaulted")
Run Code Online (Sandbox Code Playgroud)

我想知道为什么不能使用像我写的"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()
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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)
}
Run Code Online (Sandbox Code Playgroud)

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

ped*_*o91 10

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

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

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

在java中有一个.map,不确定是否有.fold,你需要查看文档

编辑:当您要求折叠换行时,请尝试使用括号:

Some(2).fold
  {
    println("error")
  }
  {
    value =>
      println(s"Success: $value")
  }
Run Code Online (Sandbox Code Playgroud)