如何从Seq[Option[String]]生成仅含非空dates的Scala Map
解决方案
你可以通过以下几种方式实现需求,核心思路是先过滤无效的None值,再筛选出日期列表非空的条目,最终转换为Map:
方法一:分步处理(清晰直观)
val sources = getSources() // returns Seq[Option[String]] val resultMap = sources // 提取所有非空的source字符串 .collect { case Some(source) => source } // 映射为(source, 日期列表)的键值对 .map(source => source -> getDates(source)) // 过滤掉日期列表为空的条目 .filter { case (_, dates) => dates.nonEmpty } // 转换为Map .toMap
方法二:在collect中返回Option后扁平化
val sources = getSources() // returns Seq[Option[String]] val resultMap = sources.collect { case Some(source) => val dates = getDates(source) // 日期非空则返回包含键值对的Option,否则返回None if (dates.nonEmpty) Some(source -> dates) else None } // 扁平化去掉所有None,再转换为Map .flatten.toMap
方法三:使用for推导式(Scala风格)
val sources = getSources() // returns Seq[Option[String]] val resultMap = (for { // 只取非None的source Some(source) <- sources // 获取对应的日期列表 dates = getDates(source) // 仅保留日期列表非空的情况 if dates.nonEmpty } yield source -> dates).toMap
以上三种方法都能解决你原代码中else分支无法编译的问题,最终得到仅包含有效source和对应非空日期列表的Map。
内容的提问来源于stack exchange,提问作者IUnknown
相关产品推荐
相关产品推荐

