如何从List中获取对象?从List(Map())提取User对象的代码疑问
如何从嵌套的List(Map)结构中提取User对象
首先,咱们先拆解你给出的结构:你手里是一个List包裹着单个Map,而这个Map里的deleteItem键对应的值是一个包含目标User的ArrayBuffer。你之前写的那段map代码其实只是在做无意义的结构转换,根本没触碰到实际的User数据,所以咱们换个思路来提取。
分步提取方案(安全优先)
因为每一层结构都可能为空(比如List可能是空的、Map里可能没有deleteItem键、ArrayBuffer也可能没内容),所以咱们用Option来链式处理,避免抛出异常:
// 假设你的List(Map)结构已经存储在yourList变量中 val yourList = List(Map( "name" -> ArrayBuffer(), "age" -> ArrayBuffer(), "deleteItem" -> ArrayBuffer(User(1, "Nick Holland", 25, None)), "action" -> ArrayBuffer("remove") )) // 链式提取目标User,全程用Option避免空指针/无元素异常 val targetUser: Option[User] = yourList.headOption .flatMap(formMap => formMap.get("deleteItem")) // 从Map中取deleteItem对应的ArrayBuffer .flatMap(userBuffer => userBuffer.headOption) // 从ArrayBuffer中取第一个User(也就是你的目标对象)
直接提取(如果能确保结构非空)
如果你能100%确定List里有且只有一个Map、deleteItem键一定存在、且ArrayBuffer里一定有User,也可以用更直接的写法,但不推荐在生产代码里这么用(容易出异常):
val targetUser = yourList.head("deleteItem").head
为什么你原来的代码没用?
你写的val a = request.body.asFormUrlEncoded.toSeq.map(a => a.map(b => b))其实只是在做结构转换:
request.body.asFormUrlEncoded返回的是Option[Map[String, Seq[String]]]- 转成
Seq后变成了Seq[(String, Seq[String])](也就是键值对的序列) - 嵌套的
map(b => b)完全是原地返回,没有任何数据提取的逻辑,所以这段代码根本帮不到你拿到User。
额外提示(如果用Play Framework)
如果这是在Play Framework里处理表单提交,其实可以用Form绑定来更优雅地处理整个表单数据,但如果只是需要提取这个特定的User,上面的提取方案就足够了。
内容的提问来源于stack exchange,提问作者Слава Иванов
相关产品推荐
相关产品推荐

