标签: scala-option

在Scala中使用JSON到XML并处理Option()结果

请考虑Scala解释器中的以下内容:

scala> JSON.parseFull("""{"name":"jack","greeting":"hello world"}""")
res6: Option[Any] = Some(Map(name -> jack, greeting -> hello world))
Run Code Online (Sandbox Code Playgroud)

为什么在Some()中返回Map?我该如何使用它?

我想将值放在xml模板中:

<test>
  <name>name goes here</name>
  <greeting>greeting goes here</greeting>
</test>
Run Code Online (Sandbox Code Playgroud)

将Scala从Some(thing)中取出并在xml中获取这些值的Scala方法是什么?

scala scala-option

2
推荐指数
3
解决办法
2093
查看次数

从Scala中的通用选项数组返回值

我在使用我的函数泛型方面遇到一些困难,需要一些帮助.我有一个数组采用T的选项,其中T是一个分数.在F#中,有一个"选择"功能可以从一组选项中删除无.在scala中,我试图使用"flatten",但它不适用于泛型类型.

我的代码是

var arr = Array.fill(capacity)(None :Option[T])
Run Code Online (Sandbox Code Playgroud)

......后来我试着获得Some的价值观:

var flat = arr.flatten
Run Code Online (Sandbox Code Playgroud)

错误是:

错误:找不到参数m的隐含值:scala.reflect.ClassManifest [U] val flat = arr.flatten

我是一个完整的scala noob,也许不应该玩泛型:)我怎么做这个工作?

谢谢!

scala scala-option

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

为什么这两个代码块与Option类相同?

在编写的Option类的文档中,以下两个示例是等效的:

val name: Option[String] = request getParameter "name"
val upper = name map { _.trim } filter { _.length != 0 } map { _.toUpperCase }
println(upper getOrElse "")
Run Code Online (Sandbox Code Playgroud)

val upper = for {
  name <- request getParameter "name"
  trimmed <- Some(name.trim)
  upper <- Some(trimmed.toUpperCase) if trimmed.length != 0
} yield upper
println(upper getOrElse "")
Run Code Online (Sandbox Code Playgroud)

但是我不明白它们是如何等价的:在第一个代码块中request getParameter "name"返回类型的实例Option[String],但是在第二个代码块语句中name <- request getParameter "name"返回类型的实例String(我假设因为下一个语句trimname变量上调用方法(trim未定义Option[String])).

scala scala-option

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

Scala成语首先从迭代器中找到一些Option

我有一个选项的迭代器,并希望找到第一个成员:

  1. 一些
  2. 并符合谓词

什么是最好的惯用方法呢?

另外:如果在此过程中抛出异常,我想忽略它并转移到下一个成员

scala scala-collections scala-option

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

用于从两个选项中获取单个选项的惯用scala,如果有两个选项则抛出异常

val one: Option[Int] = None    
val two = Some(2)

Option(one.getOrElse(two.getOrElse(null))) // Gives me Some(2) which I want

val one = Some(1)
val two = None

Option(one.getOrElse(two.getOrElse(null))) // Gives me Some(1) which I want

val one: Option[Int] = None
val two: Option[Int] = None

Option(one.getOrElse(two.getOrElse(null))) // Gives me None which I want

val one = Some(1)
val two = Some(2)

Option(one.getOrElse(two.getOrElse(null))) // Gives me Some(1) when I want an exception
Run Code Online (Sandbox Code Playgroud)

我简要地研究了Either类型,但它似乎是"表示两种可能类型之一的值".我错过了一些数据结构还是Monad?基本上我想要一个显式的(并且如果两者都有价值则抛出错误)如果可用则获得一个或获得无

monads scala scala-option

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

从Scala中的Option [..]获取java.io.Serializable

(几周前刚从Scala开始,所以请多多包涵)

在这里阅读/尝试这篇小文章,遇到了一些惊喜

http://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html

按照说明定义案例类User之后:

case class User(
  id: Int,
  firstName: String,
  lastName: String,
  age: Int,
  gender: Option[String])

object UserRepository {
  private val users = Map(1 -> User(1, "John", "Doe", 32, Some("male")),
                          2 -> User(2, "Johanna", "Doe", 30, None))
  def findById(id: Int): Option[User] = users.get(id)
  def findAll = users.values
}
Run Code Online (Sandbox Code Playgroud)

,这是我观察到的:

> scala> UserRepository.findById(1)
> res34: Option[User] = Some(User(1,John,Doe,32,Some(male)))
> 
> scala> UserRepository.findById(1).get
> res35: User = User(1,John,Doe,32,Some(male))
> 
> scala> UserRepository.findById(1).getOrElse("N/A")
> res36: java.io.Serializable = User(1,John,Doe,32,Some(male))
>
> scala> UserRepository.findById(3).getOrElse("N/A") …
Run Code Online (Sandbox Code Playgroud)

null scala scala-option

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

需要将 Seq[Option[A]] 转换为 Option[Seq[A]]

使用案例

我有一个文件列表,这些文件可能具有或不具有有效的 mime 类型。在我的代码中,我使用选项来表示这一点。

我需要将 Seq[Option[T]] 转换为 Option[Seq[T]] ,以便在某些文件无效时我不会处理该列表。

错误

这是下面的实现中的错误:

found   : (Option[Seq[A]], Option[A]) => Option[Seq[A]]
[error]  required: (Option[Any], Option[Any]) => Option[Any]
[error]     s.fold(init)(liftOptionItem[A])
Run Code Online (Sandbox Code Playgroud)

执行

def liftOptionItem[A](acc: Option[Seq[A]], itemOption: Option[A]): Option[Seq[A]] = {
    {
      acc match {
        case None => None
        case Some(items) =>
          itemOption match {
            case None => None
            case Some(item) => Some(items ++ Seq(item))
          }
      }
    }
  }

  def liftOption[A](s: Seq[Option[A]]): Option[Seq[A]] = {
    s.fold(Some(Seq()))(liftOptionItem[A])
  }
Run Code Online (Sandbox Code Playgroud)

此实现返回Option[Any]而不是Option[Seq[A]因为 的类型liftOptionItem[A]不适合。

scala fold scala-option

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

将 Either[A, B] 转换为 Option[A],其中 Left 变为 Some

我想将 an 转换Either[A, B]为选项,这样 if Eitheris Leftit is Some[A],如果 it is Rightit is None

到目前为止我已经想出了

either.swap.map(Some(_)).getOrElse(None)
Run Code Online (Sandbox Code Playgroud)

这有点拗口。

either match { 
  case Left(value) => Some(value)
  case Right(_) => None
}
Run Code Online (Sandbox Code Playgroud)

这很好,但理想情况下我想知道是否有更惯用的方法使用方法而不是显式匹配。

scala either scala-option

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

在 Scala 中处理两个选项

我有 2 个选项,我需要取它们持有的值的平均值。

有可能缺少一个或两个。如果缺少其中一个值,我只会将另一个值作为平均值。但如果两者都缺失,我会求助于一些默认值。

如何以干净的方式做到这一点?

我可以使用 isEmpty 检查值的缺失,但是这与空检查不一样吗?

scala scala-option

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

如何在 for-yield 块中记录 None 错误

我的 Scala 代码结构类似于以下内容

for {
  item1 <- findItem1
  item2 <- item1.get("item2_info")
} yield {
  val item3 = createItem3(item2)
  if (logic_using_item3) {
    do something here
  }
}
Run Code Online (Sandbox Code Playgroud)

我的理解是,在这段代码中,如果item1oritem2解析为,None那么整个执行链就会停止,并且不会执行yield块。您可以看到,item3依赖于item2不为 None,而它本身也依赖于item1不为 None。

我想包括错误报告,但在保留 for-yield 块的同时我能想到的最好的方法是以下(注意:我对 Scala 和函数式编程相当陌生,但意识到以下不是“Good Scala”) :

val x = for {
  item1 <- findItem1
  item2 <- item1.get("item2_info")
} yield {
  val item3 = createItem3(item2)
  if (logic_using_item3) {
    do something here
  }
}
if (x == None) {
   logger.error("Something …
Run Code Online (Sandbox Code Playgroud)

error-logging scala for-comprehension scala-option

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