You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Kotlin数据类提取字段值传递给RecyclerView Adapter展示

实现方案

首先可以明确:你可以结合flatMap和map函数完成需求,写法比手动循环简洁很多,完全符合Kotlin的函数式编程习惯。

先修正数据类的潜在问题

你当前定义的数据类有两个小坑需要先调整,否则接口解析时会直接崩溃:

  1. 接口返回的birthday字段可能为null,你目前定义的是非空String类型,需要改为可空类型String?
  2. 你声明了avatrUrl字段并加了@SerializedName("avatr_url")注解,但接口返回的JSON里根本没有这个字段,建议改为可空类型并设置默认值:val avatrUrl: String? = null

修正后的Response数据类参考:

data class Response(
    @SerializedName("avatr_url")
    val avatrUrl: String? = null,
    val birthday: String?,
    @SerializedName("f_name")
    val fName: String,
    @SerializedName("l_name")
    val lName: String,
    val specialty: List<Specialty>
)

提取specialty名称的代码实现

你需要的是所有员工关联的所有岗位的名称,因为每个员工对应一个specialty列表,属于嵌套列表结构,所以先用flatMap把内层的Specialty列表铺平为单层列表,再用map提取name字段即可:

// 假设你已经拿到接口返回的EmployeesInfo实例,变量名为employeesInfo
val specialtyNameList = employeesInfo.response
    // 把所有员工的specialty列表展开,得到一个全局的List<Specialty>
    .flatMap { it.specialty }
    // 提取每个Specialty的name字段
    .map { it.name }

可选扩展操作

  • 如果需要去重,直接在末尾加.distinct()即可,比如你示例中的两个员工都是同一个岗位,去重后列表只会保留一个值
  • 如果name字段可能为null,可以把map换成mapNotNull过滤空值:.mapNotNull { it.name }

传给RecyclerView Adapter

拿到specialtyNameList之后,直接更新Adapter的数据集即可:

  • 如果你用的是普通自定义Adapter,把数据集替换为新列表后调用notifyDataSetChanged()
  • 如果你用的是ListAdapter,直接调用adapter.submitList(specialtyNameList)即可

补充说明

如果你只用map不用flatMap的话,employeesInfo.response.map { it.specialty }得到的会是List<List<Specialty>>嵌套列表,没法直接提取名称,所以必须用flatMap做列表铺平操作。

内容的提问来源于stack exchange,提问作者user459666

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:15:09