【问题标题】:Which will be the better way or more performance oriented while dealing with Maps in Scala在 Scala 中处理地图时,哪种方式更好或更注重性能
【发布时间】:2017-11-07 09:24:01
【问题描述】:

我有一个方法,比如 func_1,我正在从中返回一个 Map。

然后我想迭代这个 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 

【问题讨论】:

    标签: scala functional-programming


    【解决方案1】:

    我会选择更简单、更清晰的那个,这在很大程度上取决于上下文和实现。我几乎可以肯定不会有性能差异。通过避免额外的堆栈帧或其他方式,从磁盘读取文件肯定会支配您节省的任何额外时间。无论如何,进行性能优化的最佳方法是实际测量和测试它。

    通常您应该使用def 编写函数。它是更典型的风格,并且避免实例化额外的函数对象。当然也有例外,但我认为在这种情况下没有任何理由这样做。

    【讨论】:

    • 额外函数对象在哪里???也只需留下无论如何都需要的磁盘读取部分。我更关注的方法是迭代映射并传递一个元组,该元组将多次调用该方法,或者只是将映射作为参数传递,该参数仅调用一次方法,进一步处理将在各自调用的函数中完成
    • val func_1 = (path:String) =&gt; ... 分配一个Function1 对象并将其分配给func_1def func_1(path: String) ... 没有。我从你的问题中了解到你关注的是什么,我的回答是不要专注于那个,而是选择你认为更简单的那个。或者实现两者,看看你是否可以测量差异(我猜你将无法)。
    • 那么使用 val 创建函数有什么用?这不是很好的做法吗..?
    • 例如,如果您经常需要将函数本身作为对象返回,或者将其直接传递给另一个函数/方法调用。如果您所做的只是调用该函数,那么您可能应该使用def。如果您搜索“scala 方法与函数”,就会有很多很好的信息。
    猜你喜欢
    • 2012-09-28
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多