我有一个方法说func_1,我从它返回一个地图。
然后我想迭代这个Map并希望在我的第二种方法func_2中操作它的内容(逐个记录)。
最好的方法是做什么。就像我应该将整个Map [String,String]作为参数传递给我的第二个方法'func_2',然后迭代并在'func_2'中进行处理OR..OR ..我应该让'Func_2'接受一个(String, String)元组作为参数然后使用resultmap.map(x => func_2(x_1,x_2))。另一个角度是..我应该使用VAL
而不是def
来创建函数,因为val
只会被调用一次。
以下是代码:
功能:1
val func_1 = (path:String) => {
val inputBufferedSource = Source.fromFile(path)
val indexMap = inputBufferedSource.getLines().map(x => (x.split(",")(0).toLowerCase.trim, x.split(",")(1).toLowerCase.trim)).toMap
inputBufferedSource.close()
indexMap
}:Map[String,String]
val func_2 = <Signature & logic>
现在哪个更好
val func_2(x:String, y:String)
或
val func_2(inMap:Map[String,String])
然后......打电话给它
val resultMap = obj.func_1(args(0))
resultMap.map(x => obj.func_2(x._1,x._2)) // This will call the method for every iteration But if it is val then only once i guess
或
val resultMap = obj.func_1(args(0))
obj.func_2(resultMap) // Here method is called just once
答案 0 :(得分:1)
我会选择更简单,更清晰的方式,这在很大程度上依赖于上下文和实现。我几乎肯定不会有性能差异。通过避免额外的堆栈帧或其他任何东西,从磁盘读取文件肯定会占用您节省的额外时间。无论如何,进行性能优化的最佳方法是实际测量和测试它。
通常,您应该使用def
编写函数。它是更典型的风格,并避免实例化额外的功能对象。当然也有例外,但在这种情况下我没有看到任何理由这样做。