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

时间:2018-02-15 11:02:07

标签: scala iterator spray

我有以下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 } 。所以我做了以下事情:

allprojects {
    repositories {
        jcenter()
        maven {
            url = "https://repository-achartengine.forge.cloudbees.com/snapshot/"
        }
    }
}

但这不会从列表中提供该特定值。

2 个答案:

答案 0 :(得分:1)

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

val sessionId: Option[String] = someList.collectFirst {
  case h: `Set-Cookie` if h.cookie.name == "JSESSIONID" => h.cookie.content
}

现在只需妥善处理Option[String]

.collectFirst的作用类似于.filter.map.find

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

答案 1 :(得分:0)

我让它工作的唯一方法如下(虽然我不喜欢使用拆分,所以直到找到任何优雅的方式):

val sessionId = someList.filter(_.name.equals("Set-Cookie")).
map { x => x.value.split(";")(0).split("=")(1)}.headOption          
println("sessionId: "+sessionId.get)