如何基于三个等长Array[String]创建List[resource]实例列表
解决方案:Scala中从三个等长数组生成Resource列表
这事儿在Scala里用集合的函数式操作就能轻松搞定,完全不用手动遍历索引写重复代码~
首先,我们可以利用Scala集合的zipped方法,它能把三个等长的集合按索引一一配对,然后通过map来生成对应的Resource实例。
基础实现(假设所有count字符串都能转成Int)
先看最直接的写法,假设你的三个数组和样例类已经定义好:
// 示例输入数组 val val1: Array[String] = Array("server-1", "server-2", "db-cluster") val val2: Array[String] = Array("2", "5", "1") val val3: Array[String] = Array("us-west-2", "eu-central-1", "ap-northeast-1") // 你的样例类(建议首字母大写,符合Scala命名惯例) case class Resource(name: String, count: Int, location: String) // 生成目标列表 val newList: List[Resource] = (val1, val2, val3).zipped.map { (name, countStr, location) => Resource(name, countStr.toInt, location) }.toList
解释一下:
(val1, val2, val3).zipped会把三个数组的同索引元素打包成三元组,比如第一个元素是(val1(0), val2(0), val3(0))map遍历每个三元组,把count字符串转成Int后,创建Resource对象- 最后调用
toList把Array转换成你需要的List类型
进阶:处理可能的Int转换异常
如果val2里的字符串有可能无法转成Int(比如空串、非数字字符),可以用toIntOption来安全处理,过滤掉无效的元素:
val newList: List[Resource] = (val1, val2, val3).zipped.flatMap { (name, countStr, location) => // 尝试转换,成功则生成Resource,失败则返回None(会被flatMap过滤) countStr.toIntOption.map(Resource(name, _, location)) }.toList
这样如果某个count字符串转换失败,对应的元素就不会出现在最终的List里,避免抛出运行时异常。
替代写法(用zip嵌套)
如果你习惯分步zip,也可以先把前两个数组zip,再和第三个数组zip,写法如下:
val newList: List[Resource] = val1.zip(val2).zip(val3).map { case ((name, countStr), location) => Resource(name, countStr.toInt, location) }.toList
不过这种写法不如zipped直观,推荐优先用zipped的方式。
内容的提问来源于stack exchange,提问作者rangeelo
相关产品推荐
相关产品推荐

