请考虑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方法是什么?
我在使用我的函数泛型方面遇到一些困难,需要一些帮助.我有一个数组采用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,也许不应该玩泛型:)我怎么做这个工作?
谢谢!
在编写的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(我假设因为下一个语句trim在name变量上调用方法(trim未定义Option[String])).
我有一个选项的迭代器,并希望找到第一个成员:
什么是最好的惯用方法呢?
另外:如果在此过程中抛出异常,我想忽略它并转移到下一个成员
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?基本上我想要一个显式的(并且如果两者都有价值则抛出错误)如果可用则获得一个或获得无
(几周前刚从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) 使用案例
我有一个文件列表,这些文件可能具有或不具有有效的 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]不适合。
我想将 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)
这很好,但理想情况下我想知道是否有更惯用的方法使用方法而不是显式匹配。
我有 2 个选项,我需要取它们持有的值的平均值。
有可能缺少一个或两个。如果缺少其中一个值,我只会将另一个值作为平均值。但如果两者都缺失,我会求助于一些默认值。
如何以干净的方式做到这一点?
我可以使用 isEmpty 检查值的缺失,但是这与空检查不一样吗?
我的 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)