簡體   English   中英

如何在Scala中從中獲取實際值:正確(Vector(“ abc”))

[英]How do I get the actual value from this in Scala : Right(Vector(“abc”))

我正在使用加特林測試基於WebSocket的服務,為了解析json響應,我得到了以下內容:

val initiator = JsonPath.query("$.header.initiator", json).right.map(_.toVector)

打印啟動器告訴我這是:

Right(Vector(guest3075085133639688955@example.com))

現在到初學者Scala問題:

如何獲取實際的字符串值“ guest3075085133639688955@example.com”?

我了解到Right只是一個容器,包含一個帶有一個值(我想要的值)的Vector,但是我該怎么去呢? :)

我已經嘗試過了,但這只是打印出相同的東西(Right(Vect ....):

initiator.foreach{println}

干杯,尼克拉斯

  • 您可以使用right獲得EitherRightProjectionget Right內部的值。
  • 您可以使用headVector獲取第一個(並且僅在您的情況下)元素。

看起來像:

val initiator: Either[String, Vector[String]] = 
  Right(Vector("guest3075085133639688955@example.com"))

initiator.right.get.head
// String = guest3075085133639688955@example.com

您還可以進行模式匹配:

val Right(Vector(email)) = initiator
// email: String = guest3075085133639688955@example.com

請注意,這兩種方法僅在initiatior器為“ Right且“ Vector內部具有至少一個元素時才起作用。 您的問題還不太清楚,您想如何處理Left和/或空的Vector


如果您想以其他方式處理所有失敗的案例,則可以使用:

initiator match {
  case Right(Vector(email)) => email // ok
  case _ => // default -> fail
}

initiator.right.get無論從是不安全的。 因為如果它是一個左值,它將拋出java.util.NoSuchElementException

通過模式匹配:

initiator match {
  // when it is a right value, which is a vector with single element
  case Right(Vector(s)) => println(s)
  // when it is a right value, which is a vector with empty or two or more elements.
  case Right(v) => ???
  // when it is a left value
  case Left(l) => ???
}

在注釋中,您澄清了這是針對測試用例的情況。 如果您使用的是ScalaTest匹配器,則可以執行以下操作:

initiator should matchPattern{case Right(Vector("expected value")) => }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM