映射
Map
价值观
我想知道如何从平面图中获得对象的属性,如下所示:
例如,如果我只想从这个对象中获取名称,那么最好的方法是什么?
TL;博士
在没有数据的情况下,我想:
val extractedNames: Map<Long, String?> = destinationDepartment
.mapValues { (_, userData: Map<String, Any?>) ->
when (val name = userData["name"]) {
is String -> name
else -> null
}
}
println(extractedNames)
// {1=Bergen, 2=Cindy, 3=Dave}
简介
Kotlin非常适合处理集合。对于如何在Kotlin中使用集合的更一般的了解,我认为文档非常清楚
Collection transformation operations#Map
.
让我们看看这个例子是如何工作的。您想要提取一个特定的元素,因此我们可以使用
map()
.
Map<Long, Map>
,其中值为
Map<String, Any?>
. 我想你是想换个房间
地图<长,地图>
到
Map<Long, String>
,其中键是数据库ID,值是用户名。
测试数据
所以我有一些东西要测试,我做了一个新的
地图
:
val destinationDepartment: Map<Long, Map<String, Any?>> =
mapOf(
1L to mapOf(
"id" to 1,
"name" to "Bergen",
"createdAt" to LocalDateTime.now(),
"updatedAt" to LocalDateTime.now(),
),
2L to mapOf(
"id" to 2,
"name" to "Cindy",
"createdAt" to LocalDateTime.now(),
"updatedAt" to LocalDateTime.now(),
),
3L to mapOf(
"id" to 3,
"name" to "Dave",
"createdAt" to LocalDateTime.now(),
"updatedAt" to LocalDateTime.now(),
),
)
基本节点
Map
可以转换为
Entries
地图()
,它将在每个
Entry
地图
和
必须
返回一个新值。
map.entrySet().stream().map(...)...
在这里,lambda只返回一对(使用
to
).
val extractedNames = destinationDepartment
.map { (id: Long, userData: Map<String, Any?>) ->
id to userData
}
println(extractedNames)
// Output: [(1, {id=1, name=Bergen, createdAt=2021-08-19T11:00:07.447660, updatedAt=2021-08-19T11:00:07.449969}),
// (2, {id=2, name=Cindy, createdAt=2021-08-19T11:00:07.463813, updatedAt=2021-08-19T11:00:07.463845}),
// (3, {id=3, name=Dave, createdAt=2021-08-19T11:00:07.463875, updatedAt=2021-08-19T11:00:07.463890})]
userData: Map<String, Any?>
.
val extractedNames = destinationDepartment
.map { (id: Long, userData: Map<String, Any?>) ->
val name = userData["name"]
id to name
}
println(extractedNames)
// Output: [(1, Bergen), (2, Cindy), (3, Dave)]
现在有很多方法可以改进这一点。确保
name
是字符串,不是
Any?
,过滤掉空白或空名称,映射到DTO,排序。同样,Kotlin文档将是一个良好的开端。我将首先列出一个非常好的改进。
转换
List<Pair<>>
Map<>
如果你看一下
val extractedNames
,您将看到它是一个列表,而不是一张地图。
val extractedNames: List<Pair<Long, Any?>> = ...
地图()
函数正在返回一个
Pair<Long, String>
. 科特林不知道这仍然被认为是一个错误
地图
. 我们可以转换任何
列表<配对<&燃气轮机&燃气轮机;
toMap()
toMap()
val extractedNames: Map<Long, Any?> = destinationDepartment
.map { (id: Long, userData: Map<String, Any?>) ->
val name = userData["name"]
id to name
}
.toMap() // convert List<Pair<>> to a Map<>
println(extractedNames)
// Output: {1=Bergen, 2=Cindy, 3=Dave}
但这也不是很好。为什么
id: Long
在lambda中,如果我们不使用它?因为我们只提取
名称
userData
,我们只是在映射
价值观
的
地图
. 我们不需要
id:长
完全幸运的是,Kotlin还有另一个有用的方法:
mapValues()
-它返回一个
,这样我们就可以放下
toMap()
. 让我们使用它。
mapValues()
val extractedNames: Map<Long, Any?> = destinationDepartment
.mapValues { (id: Long, userData: Map<String, Any?>) ->
val name = userData["name"]
id to name
}
println(extractedNames)
// {1=(1, Bergen), 2=(2, Cindy), 3=(3, Dave)}
嗯,奇怪。为什么会这样
id
什么是价值观?那是因为
mapValues()
身份证件
和
名称
-哎呀!让我们只返回名称。
固定
val extractedNames: Map<Long, Any?> = destinationDepartment
.mapValues { (_, userData: Map<String, Any?>) ->
userData["name"]
}
println(extractedNames)
// {1=(1, Bergen), 2=(2, Cindy), 3=(3, Dave)}
较好的因为
没有使用,
an underscore can be used instead
return
. 阅读
Returning a value from a lambda expression