如何在scala中根据条件从列表中获取值

如何在scala中根据条件从列表中获取值,scala,iterator,spray,Scala,Iterator,Spray,我有以下valheaders:List[HttpHeader]: val someList = List(Server: Apache-Coyote/1.1, Set-Cookie: JSESSIONID=879sdf97f98s7f9a87dgssa7987; Path=/userApi/; HttpOnly) 现在我想从上面的列表中获取879sdf97f98s7f9a87dgssa7987。因此,我做了以下工作: someList.iterator.filter(_.name.equal

我有以下
valheaders:List[HttpHeader]

val someList = List(Server: Apache-Coyote/1.1, Set-Cookie: 
JSESSIONID=879sdf97f98s7f9a87dgssa7987; Path=/userApi/; HttpOnly)
现在我想从上面的列表中获取
879sdf97f98s7f9a87dgssa7987
。因此,我做了以下工作:

someList.iterator.filter(_.name.equals("Set-Cookie")).map { x => x.value }
但这并没有给出列表中的特定值

import spray.http.HttpHeaders.`Set-Cookie`

val sessionId: Option[String] = someList.collectFirst {
  case h: `Set-Cookie` if h.cookie.name == "JSESSIONID" => h.cookie.content
}
现在只需适当地处理
选项[String]

.collectFirst
的工作原理类似于
.filter
.map
.find
的组合

首先,它按类型
Set Cookie
过滤标题。 其次,因为此时
HttpHeader
已经被强制转换为
Set Cookie
,所以我们可以访问它的
.Cookie
属性并在搜索谓词中使用它。
第三,我们要求找到一个名为
JSESSIONID
的cookie并获取其值。

我让它工作的唯一方法如下(尽管我不喜欢使用split so,直到找到任何优雅的方法):


为什么要调用
iterator
?提供
HttpHeader
对象/类的定义,是否使用spray http?从列表中迭代每个元素,并获取名称等于
Set Cookie
的元素。您可以使用
过滤器和
免费获取该元素。map
否?
someList.filter(u.name.equals(“Set Cookie”)).map{x=>x.value}
您不需要迭代器更新我的答案。请重试。现在没有编译时错误,但结果不是预期的。这是现在的结果:
Some(JSESSIONID=879sdf97f98s7f9a87dgssa7987;Path=/userApi/;HttpOnly)
再次更新了我的答案。显然,在
喷洒http
中,你需要调用
.content
而不是
.value
。确定了。它将给出列表[String]而不是选项[String]。对。应该是
.collectFirst
而不是
.collect
val sessionId = someList.filter(_.name.equals("Set-Cookie")).
map { x => x.value.split(";")(0).split("=")(1)}.headOption          
println("sessionId: "+sessionId.get)