如何在平面图中制作循环和异常?
Posted
技术标签:
【中文标题】如何在平面图中制作循环和异常?【英文标题】:How to make loop and exception inside flatmap? 【发布时间】:2021-07-28 05:32:03 【问题描述】:我有一个要求,我必须遍历一个列表并创建Map[String,String]
。这里标题的值如下所示:
val headersMap = scala.collection.mutable.Map[String, String]()
try
val payloadHeaders = collectorPayload.headers
for (values <- payloadHeaders.toList)
for (value <- values)
val header = value.split(":").map(_.trim)
headersMap += (header(0) -> header(1))
headersMap += ("Content-Type" -> "application/json; charset=UTF-8")
catch
case e: Exception =>
logger.error("Collector Payload extraction error with : " + e.getMessage)
有没有更好的方法来处理任何地图或平面地图的方式?
【问题讨论】:
【参考方案1】:不要使用可变集合或变量(只是假装它们不存在,因为你遇到了一个你肯定不能没有它们的用例......它不会很快) . 通常也要避免使用循环(因为它们有点假设并促进了可变性和副作用),与可变集合相比,您需要它们的频率更低。
collectorPayload
.headers
.iterator
.flatMap(_.split(":").map(_.trim))
.map case Array(a,b) => a -> b
.toMap + ("Content-Type" -> "application/json; charset=UTF-8")
【讨论】:
这里最好使用collect
,以防 Array 没有两个元素。还是宁愿让它崩溃也不愿默默地丢弃值?
我不知道,OP 周围有一个try/catch
,所以,我假设是后者...
感谢您的回答。我有一个问题,您使用的平面图中的值是什么?在循环中它是存储每个元素
我做的和你的循环一样。您可能会发现在 repl 中逐个运行每个语句并准确查看每个步骤发生的转换很有帮助(将 .iterator
替换为 .toList
以获得漂亮的打印结果)。
不,如果没有两个元素,您的代码将抛出两个...或者您的意思是,您的 more 多于两个?这很奇怪,但无论如何。只需将 .map
替换为 .collect
就可以了。以上是关于如何在平面图中制作循环和异常?的主要内容,如果未能解决你的问题,请参考以下文章