我有以下輸入值
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]),
)
)
我這里的要求是:
有 2 種費率。一種是固定利率,另一種是限時利率
如果日期大于今天,我需要應用限時費率(例如)
我正在嘗試使用如下方法創建一個統一的地圖
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)
還是有一種完全不同的方法可以有效地解決這個問題?
uj5u.com熱心網友回復:
(我想,我誤解了你最初想要做的事情,所以我在第一個答案中洗掉了,用這個代替):
您實際上幾乎擁有它,唯一的問題是您的第二張地圖中的值是Options. 只需“打開”它們:
contractRate timeBoundContractRatesList.mapValues {
_.find(date.after(_._1)).map(_._2)
}.collect { case(k, Some(v)) => k -> v }
此處與您的代碼段的主要區別是使用collect而不是filter:它不僅可以洗掉空值,還可以轉換非空值以擺脫Option它們周圍的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/455949.html
