我们假设如下Map:
val map = Map("eins" -> "one", "zwei" -> "two", "drei" -> "three")
Run Code Online (Sandbox Code Playgroud)
正如预期的那样map返回与给定键关联的值:
scala> map("eins")
res0: String = one
scala> map("zwei")
res1: String = two
...
Run Code Online (Sandbox Code Playgroud)
当然,如果给定的密钥不存在,它会崩溃:
scala> map("zehn")
java.util.NoSuchElementException: key not found: zehn
Run Code Online (Sandbox Code Playgroud)
有没有办法取回密钥本身而不是异常?
map("zehn") -> "zehn"
Run Code Online (Sandbox Code Playgroud)
谢谢.
鉴于后续ActionBuilder实施:
class SignedRequest[A](request: Request[A]) extends WrappedRequest[A](request) {}
object SignedAction extends ActionBuilder[SignedRequest] {
def invokeBlock[A](request: Request[A], block: SignedRequest[A] => Future[SimpleResult]) = {
block(new SignedRequest(request))
}
}
class SecuredRequest[A](request: Request[A]) extends WrappedRequest[A](request) {}
object SecuredRequest extends ActionBuilder[SecuredRequest] {
def invokeBlock[A](request: Request[A], block: SecuredRequest[A] => Future[SimpleResult]) = {
block(new SecuredRequest(request))
}
}
Run Code Online (Sandbox Code Playgroud)
我如何组合它们?我试过以下......
object MyController extends Controller {
def doSomething = SignedAction.async(parse.json) {
SecuredAction.async(parse.json) { implicit request =>
Future.successful(Ok)
}}
}
Run Code Online (Sandbox Code Playgroud)
...但我总是收到以下错误消息:
/home/j3d/test/controllers/MyController.scala:37: type mismatch;
[error] found : play.api.mvc.Action[play.api.libs.json.JsValue]
[error] required: …Run Code Online (Sandbox Code Playgroud) 鉴于以下List......
val list = List("one", "one", "two", "two", "three", "three")
Run Code Online (Sandbox Code Playgroud)
...我怎么把它转换成JsArray这样的?
["one", "two", "three"]
Run Code Online (Sandbox Code Playgroud)
如您所见,我还需要删除重复项.
给定以下 JSON 字符串...
val jsonStr = "[1, 2, 3]"
Run Code Online (Sandbox Code Playgroud)
...我如何将其转换为 a List[Int]?以下语句返回 a JsValue,其中不包含 method read:
Json.parse(jsonStr)
Run Code Online (Sandbox Code Playgroud) 这是我的common.routes文件:
GET /emails/:deflated controllers.common.Emails.viewInBrowser(deflated)
Run Code Online (Sandbox Code Playgroud)
...这里是我的控制器:
package controllers.common
object Emails extends Controller {
def viewInBrowser(deflated: String) = Action { implicit request =>
GZip.inflate(deflated) match {
case Success(inflated) => Ok(Html(inflated))
case Failure(e) => {
Logger.warn(s"error inflating email from url", e)
val support = configuration.getString("application.emails.support")
BadRequest(views.html.badRequest(Messages("common.error.invalidOrMalformedUrl", support)))
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常...但是如果我像这样反转路线
import controllers.common.routes
...
val sslEnabled = configuration.getBoolean("ssl").getOrElse(false)
val emailUrl = routes.Emails.viewInBrowser(true).absoluteURL(sslEnabled)
Run Code Online (Sandbox Code Playgroud)
...我总是以下例外:
java.lang.NoSuchFieldError: Emails
at utils.common.RoutesHelper$.emailUrl(RoutesHelper.scala:51)
at services.common.DefaultEmailComponent$DefaultRichBody.apply(EmailComponent.scala:64)
at services.common.DefaultEmailServiceComponent$DefaultEmailService.sendEmail(EmailServiceComponent.scala:81)
at utils.auth.EmailHelper$.sendUserVerificationEmail(EmailHelper.scala:32)
at controllers.auth.Users$$anonfun$create$1$$anonfun$8$$anonfun$apply$60$$anonfun$apply$61.apply(Users.scala:381)
at controllers.auth.Users$$anonfun$create$1$$anonfun$8$$anonfun$apply$60$$anonfun$apply$61.apply(Users.scala:379)
at scala.util.Success$$anonfun$map$1.apply(Try.scala:206)[ERROR] [05/30/2014 …Run Code Online (Sandbox Code Playgroud) 以下是我的多项目结构:
myApp
+ build.sbt
+ sub-prj-1
+ build.sbt
+ sub-prj-2
+ build.sbt
+ project
+ Build.scala
Run Code Online (Sandbox Code Playgroud)
我用这个来定义常用设置project/Build.scala:
import sbt._
import Keys._
object ApplicationBuild extends Build {
val defaultScalacOptions = Seq(
"-unchecked", "-deprecation", "-feature", "-language:reflectiveCalls", "-language:implicitConversions",
"-language:postfixOps", "-language:dynamics", "-language:higherKinds", "-language:existentials",
"-language:experimental.macros", "-encoding", "UTF-8", "-Xmax-classfile-name", "140")
val defaultResolvers = Seq(
"Typesafe releases repository" at "http://repo.typesafe.com/typesafe/releases/"
)
val defaultSettings = Defaults.defaultSettings ++ Seq(
scalaVersion := "2.10.4",
scalacOptions ++= defaultScalacOptions,
resolvers ++= defaultResolvers
)
}
Run Code Online (Sandbox Code Playgroud)
...然后我在每个build.sbt文件中引用这些常见设置:
name := "myapp"
organization …Run Code Online (Sandbox Code Playgroud) 鉴于以下Enumeration...
object MyEnum extends Enumeration {
type MyEnum = Value
val Val1 = Value("val1")
val Val2 = Value("val2")
val Val3 = Value("val3")
}
import MyEnum._
Run Code Online (Sandbox Code Playgroud)
...以及以下Map...
val m = Map(
val1 -> "one",
val2 -> "two",
val3 -> "three"
)
Run Code Online (Sandbox Code Playgroud)
...我需要转换m为JSON:
import play.api.libs.json._
val js = Json.toJson(m)
Run Code Online (Sandbox Code Playgroud)
最后一条语句无法编译,因为编译器找不到type的Json序列化器scala.collection.immutable.Map[MyEnum.Value,String]。
问题:由于Play确实提供了type的序列化器scala.collection.immutable.Map[String,String],并且我的枚举实际上包含字符串,是否可以重用默认的JSON序列化器?
请查看以下代码段:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
object Main extends App {
ids.foreach { l => println(l.mkString(", ")) }
for(l <- ids) println(l.mkString(", "))
def ids = Future(List(1, 2, 3, 4))
}
Run Code Online (Sandbox Code Playgroud)
方法ids返回一个Future[List[Int]],我想打印返回的值List:
ids.map { l => println(l.mkString(", ")) } // prints nothing
for(l <- ids) println(l.mkString(", ")) // prints nothing
Run Code Online (Sandbox Code Playgroud)
问题是上面的任何语句都没有打印List返回的内容ids.我错过了什么吗?
给出以下List整数......
val l = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
...我需要调用2个方法来返回Future每个元素并获得以下结果:
Future(Some(1), Some(2), Some(3))
Run Code Online (Sandbox Code Playgroud)
以下是我的尝试:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def f1(i: Int) = Future(i)
def f2(i: Int) = Future { if (i % 2 == 0) throw new Exception else i }
val l = List(1, 2, 3)
val results = Future.sequence(l.map { i =
val f = for {
r1 <- f1(i)
r2 <- f2(i) // this throws an exception if i is even
} yield Some(r1)
f.recoverWith …Run Code Online (Sandbox Code Playgroud) 我知道如何使用ioutil.ReadDir()... 列出目录中的文件但是如何按创建时间(从最旧到最新)对它们进行排序?我正在使用go 8.3.