使用map与flatmap处理Vehicle对象的实际场景咨询
在Vehicle序列中使用map和flatmap的实际场景
先明确基础定义:
class Vehicle(name: String, model: String, age: Int, color: String) val vehicles: Seq[Vehicle] = // 你的车辆序列
map的实际使用场景
map的作用是逐个转换序列里的每个元素,输出和原序列长度一致的新序列。
1. 提取或生成展示用的精简信息
比如做车辆列表展示时,不需要输出所有属性,只提取关键信息生成展示文案:
// 提取所有车辆的"名称-颜色"元组 val nameColorPairs: Seq[(String, String)] = vehicles.map(v => (v.name, v.color)) // 生成每个车辆的可读性描述 val vehicleTexts: Seq[String] = vehicles.map(v => s"${v.name} ${v.model} | 车龄${v.age}年 | 颜色${v.color}")
2. 对属性做统一转换或分类
比如数据清洗、分类统计前,对单个属性做批量处理:
// 将车龄转换成分类标签 val ageLabels: Seq[String] = vehicles.map(v => if (v.age <= 2) "准新车" else if (v.age <= 5) "次新车" else "旧车") // 统一把颜色转换成大写格式 val upperColors: Seq[String] = vehicles.map(_.color.toUpperCase)
flatmap的实际使用场景
flatmap的核心是先把每个元素转换成一个子序列,再把所有子序列扁平化合并成一个无嵌套的序列,输出长度可能和原序列不同。
1. 提取所有车辆的关联子数据(比如使用人、配置)
先扩展Vehicle类,给每个车辆加一个使用人列表属性:
class Vehicle(name: String, model: String, age: Int, color: String, val users: Seq[String])
如果要统计所有使用过这些车辆的人员,不需要按车辆分组,直接生成扁平列表:
// 提取所有使用人,合并成一个无重复的列表(可加distinct去重) val allUsers: Seq[String] = vehicles.flatMap(_.users).distinct
2. 为每个车辆生成多个标签并合并
比如做标签云时,每个车辆要生成多个标签(品牌、车龄、颜色),然后把所有标签收集到一个列表:
val allTags: Seq[String] = vehicles.flatMap(v => Seq( s"品牌:${v.name}", s"车龄档位:${v.age/5}档", s"颜色:${v.color}" ) )
3. 过滤并合并可选的关联数据
如果车辆的维修记录是可选的(有的车有,有的车没有),用flatmap可以自动跳过无记录的车辆:
// 先定义维修记录类和扩展后的Vehicle case class RepairRecord(date: String, content: String) class Vehicle(name: String, model: String, age: Int, color: String, val repairs: Option[Seq[RepairRecord]]) // 提取所有存在的维修记录,直接得到扁平的记录序列 val allRepairs: Seq[RepairRecord] = vehicles.flatMap(_.repairs)
内容的提问来源于stack exchange,提问作者IUnknown
相关产品推荐
相关产品推荐

