标签: scala-option

Scala选项||

我想获得scala中几个Option之一的值,如下所示:

def or(a:Option[Int], b:Option[Int]):Option[Int]=
    if (a.isDefined) a else b

val a= Option(1)
val b= Option(2)
or(a,b).get
Run Code Online (Sandbox Code Playgroud)

但我想知道为什么||运营商没有为Option定义?有没有更惯用的方法呢?

scala scala-option

1
推荐指数
1
解决办法
309
查看次数

"或" - Scala中的两个选项?

我想做这样的事情:

def or[A](x: Option[A], y: Option[A]) = x match {
 case None => y   
 case _ => x 
}
Run Code Online (Sandbox Code Playgroud)

这样做的惯用方法是什么?我能想到的最好的是Seq(x, y).flatten.headOption

functional-programming scala scalaz scala-option

1
推荐指数
1
解决办法
215
查看次数

处理Scala选项[T]

我有一个Scala Option[T].如果值是Some(x)我想用一个不返回值(Unit)的进程处理它,但如果是None,我想打印一个错误.

我可以使用下面的代码要做到这一点,但我明白,更习惯的方法是治疗Option[T]的顺序和使用map,foreach等我该怎么办呢?

opt match {
  case Some(x) => // process x with no return value, e.g. write x to a file
  case None => // print error message
}
Run Code Online (Sandbox Code Playgroud)

scala scala-option

0
推荐指数
1
解决办法
911
查看次数

应用或操作选项结果

我有以下代码:

class CSplit(var s1: CanvNode, var s2: CanvNode) extends SplitPane
{         
   topComponent =  s1.merge
   bottomComponent = s2.merge
   def containsV(orig: MapCanvT): Option[MapCanvT]  = 
   {
      def containsIn(cn: CanvNode): Option[MapCanvT] = cn match
      {  
        case Left => None 
        case Right(mc) => if (mc == orig) Some(mc) else None                 
      }
      containsIn(s1) match
      {
        case Some(mc) => Some(mc)
        case None => containsIn(s2)
      }
    }
 }
Run Code Online (Sandbox Code Playgroud)

我想减少containsV方法的代码.我的第一个想法是使用fold方法来缩短containsIn方法.但Option没有一个,也没有扩展Class Either.Option [T]不应该扩展[T,None]吗?然后至少有一个可以使用Either的折叠方法.

我最后的想法是将s1和s2视为一个List并找到它但我无法编译:

def containsV(orig: MapCanvT):
  Option[MapCanvT] = ::[CanvNode](s1, s2).find(_ == Right(orig))      
Run Code Online (Sandbox Code Playgroud)

scala scala-option

0
推荐指数
1
解决办法
299
查看次数

在选项[X]上使用if代替匹配

我想用if语句替换下面的匹配,最好比这更简洁.我个人觉得是否更容易在头脑中解析.

val obj = referencedCollection match{
            case None => $set(nextColumn -> MongoDBObject("name" -> name))
            case Some( collection) =>....}
Run Code Online (Sandbox Code Playgroud)

是否有等效的if语句或其他产生等效结果的方法?

scala scala-option

0
推荐指数
1
解决办法
155
查看次数

如果某些条件满足,如何在for-understanding中产生None

我正在尝试理解并编写以下代码:

object Main extends App {
    val resultOption: Option[Int] = 
    for{
        i1 <- opt1
        i2 <- opt2
    } yield {
        if(i1 + i2 > 10) null.asInstanceOf[Int]
        else i1 + i2
    }

    println(resultOption) // <---- Here

    def opt1: Option[Int] = //some computations
    def opt2: Option[Int] = //some computations
}
Run Code Online (Sandbox Code Playgroud)

IDEONE工作示例

我希望resultOptionNone的情况下满足条件,但Some(0)返回.我查看了yield块的编译代码,我们在这里得到的是:

Code:
   0: aload_0
   1: getfield      #25                 // Field i1$1:I
   4: iload_1
   5: iadd
   6: bipush        10
   8: if_icmple     18
  11: aconst_null
  12: invokestatic  #31 …
Run Code Online (Sandbox Code Playgroud)

scala for-comprehension scala-option

0
推荐指数
1
解决办法
186
查看次数

确定子类中的非空附加字段

假设我有一个看起来像这样的特征

trait MyTrait {
  val x: Option[String] = None
  val y: Option[String] = None
}
Run Code Online (Sandbox Code Playgroud)

发布定义特征我将此特征扩展到一个MyClass看起来像这样的类

case class MyClass(
  override val x: Option[String] = None, 
  override val y: Option[String] = None, 
  z: Option[String] = None
) extends MyTrait
Run Code Online (Sandbox Code Playgroud)

现在我需要查找除了由MyTraitis not扩展的属性之外的任何其他属性None。从某种意义上说,如果我需要编写一个被调用的方法,该方法getClassInfo根据案例类中存在的值返回真/假。在这种情况下,如果z是非可选的,它应该返回 true 。我getClassInfo的事情是这样的

def getClassInfo(myClass: MyClass): Boolean = {
  myClass
    .productIterator
    .filterNot(x => x.isInstanceOf[MyTrait])
    .exists(_.isInstanceOf[Some[_]])
}

Run Code Online (Sandbox Code Playgroud)

理想情况下,这应该过滤掉所有不属于的字段,Mytraitz在这种情况下返回我。我尝试使用方差,但似乎isInstanceOf不一样

filterNot(x => x.isInstanceOf[+MyTrait])
Run Code Online (Sandbox Code Playgroud)

然而这是不可能的

val a …
Run Code Online (Sandbox Code Playgroud)

scala traits scala-option

0
推荐指数
1
解决办法
90
查看次数