Scala 连接 Map - 一个有选项,另一个没有选项
Scala concatenate Map - one with Option and other without Option
我有以下输入值
import java.sql.Timestamp
import java.lang.{Double => JDouble}
val date = Timestamp.valueOf("2021-08-01 00:00:00")
val contractRate: Map[String, JDouble] = Map("ITABUS" -> 0.075,
"KARAT-S" -> 0.10,
"KAUTRA" -> 0.05)
val timeBoundContractRatesList: Map[String, List[(Timestamp, JDouble)]] = Map(
"ITABUS" -> List((Timestamp.valueOf("2021-07-30 23:59:59"), 0.085.asInstanceOf[JDouble]),
)
)
我这里的要求是:
有两种费率。一种是固定利率,另一种是时间限制利率
如果日期大于今天(例如),我需要应用时间约束率
我正在尝试使用如下方法制作一个统一的地图
val withTimeBoundContractRate = contractRate ++ timeBoundContractRatesList
.map { case (carrier, timeRateSet) =>
val filteredEntry = timeRateSet
.filter { case (startDate, _) => date.after(startDate) }
(carrier, filteredEntry.map(_._2).headOption)
}
.filter(_._2.nonEmpty)
问题出在输出上。我得到以下输出
withTimeBoundContractRate: scala.collection.immutable.Map[String,java.io.Serializable] = Map(ITABUS -> Some(0.085), KARAT-S -> 0.1, KAUTRA -> 0.05)
但我要找的是原始数据类型的地图(没有选项)
withTimeBoundContractRate: Map[String, JDouble] = Map(ITABUS -> 0.085, KARAT-S -> 0.1, KAUTRA -> 0.05)
或者是否有完全不同的方法可以有效地解决这个问题?
(我想,我误解了你原来想做的事情,所以我删除了第一个答案,用这个代替):
你实际上几乎做到了,唯一的问题是你的第二张地图中的值是Options
。只需“打开”它们:
contractRate ++ timeBoundContractRatesList.mapValues {
_.find(date.after(_._1)).map(_._2)
}.collect { case(k, Some(v)) => k -> v }
与您的代码片段的主要区别是使用 collect
而不是 filter
:它不仅可以让您删除空值,还可以转换 non-empty 的值以获得摆脱他们周围的Option
。
我有以下输入值
import java.sql.Timestamp
import java.lang.{Double => JDouble}
val date = Timestamp.valueOf("2021-08-01 00:00:00")
val contractRate: Map[String, JDouble] = Map("ITABUS" -> 0.075,
"KARAT-S" -> 0.10,
"KAUTRA" -> 0.05)
val timeBoundContractRatesList: Map[String, List[(Timestamp, JDouble)]] = Map(
"ITABUS" -> List((Timestamp.valueOf("2021-07-30 23:59:59"), 0.085.asInstanceOf[JDouble]),
)
)
我这里的要求是:
有两种费率。一种是固定利率,另一种是时间限制利率
如果日期大于今天(例如),我需要应用时间约束率
我正在尝试使用如下方法制作一个统一的地图
val withTimeBoundContractRate = contractRate ++ timeBoundContractRatesList .map { case (carrier, timeRateSet) => val filteredEntry = timeRateSet .filter { case (startDate, _) => date.after(startDate) } (carrier, filteredEntry.map(_._2).headOption) } .filter(_._2.nonEmpty)
问题出在输出上。我得到以下输出
withTimeBoundContractRate: scala.collection.immutable.Map[String,java.io.Serializable] = Map(ITABUS -> Some(0.085), KARAT-S -> 0.1, KAUTRA -> 0.05)
但我要找的是原始数据类型的地图(没有选项)
withTimeBoundContractRate: Map[String, JDouble] = Map(ITABUS -> 0.085, KARAT-S -> 0.1, KAUTRA -> 0.05)
或者是否有完全不同的方法可以有效地解决这个问题?
(我想,我误解了你原来想做的事情,所以我删除了第一个答案,用这个代替):
你实际上几乎做到了,唯一的问题是你的第二张地图中的值是Options
。只需“打开”它们:
contractRate ++ timeBoundContractRatesList.mapValues {
_.find(date.after(_._1)).map(_._2)
}.collect { case(k, Some(v)) => k -> v }
与您的代码片段的主要区别是使用 collect
而不是 filter
:它不仅可以让您删除空值,还可以转换 non-empty 的值以获得摆脱他们周围的Option
。