【发布时间】:2017-03-01 03:31:12
【问题描述】:
将函数应用于Map 的每个元素并最终返回相同的Map 的最佳方法是什么,保持不变,以便可以在进一步的操作中使用它?
我想避免:
myMap.map(el => {
effectfullFn(el)
el
})
实现这样的语法:
myMap
.mapEffectOnKV(effectfullFn)
.foreach(println)
map 不是我要找的,因为我必须指定地图中的内容(如在第一个代码 sn-p 中),我不想这样做。
我想要一个特殊的操作,知道/假设在执行副作用函数后,地图元素应该原封不动地返回。
事实上,这对我很有用,我想拥有它以供Map、Array、List、Seq、Iterable... 总体思路是偷看在元素处做某事,然后自动返回这些元素。
我正在处理的真实案例如下所示:
calculateStatistics(trainingData, indexMapLoaders)
.superMap { (featureShardId, shardStats) =>
val outputDir = summarizationOutputDir + "/" + featureShardId
val indexMap = indexMapLoaders(featureShardId).indexMapForDriver()
IOUtils.writeBasicStatistics(sc, shardStats, outputDir, indexMap)
}
计算完每个分片的统计信息后,我想附加将它们保存到磁盘的副作用,然后只返回这些统计信息,而无需创建 val 并拥有 val 的名称成为函数中的最后一条语句,例如:
val stats = calculateStatistics(trainingData, indexMapLoaders)
stats.foreach { (featureShardId, shardStats) =>
val outputDir = summarizationOutputDir + "/" + featureShardId
val indexMap = indexMapLoaders(featureShardId).indexMapForDriver()
IOUtils.writeBasicStatistics(sc, shardStats, outputDir, indexMap)
}
stats
这可能不是很难实现,但我想知道 Scala 中是否已经为此提供了一些东西。
【问题讨论】:
-
不 - 我认为它不同。我正在尝试在地图上的一系列操作中添加具有副作用的内容。
-
我建议不要这样做。您将不必要地多次遍历地图。只需迭代一次,然后对单次迭代中的键值对执行您需要做的任何事情。
-
这有时被称为
tap。 -
@Yawar - 我添加了我的真实案例。我不认为我会重复多次。
标签: scala