【问题标题】:Scala - how to access an object from a class?Scala - 如何从类中访问对象?
【发布时间】:2018-07-16 12:49:56
【问题描述】:

我想在一个类(对象)中创建一个包含有关销售信息的 Map,并在另一个类中使用它 ProcessSales - 遍历 Map 键并使用值。我已经编写了在对象SalesData 中创建地图的逻辑。

但是,自从我不久前开始学习 Scala 以来,我不确定它是否是在对象中实现逻辑的好方法。

从另一个类访问地图的正确方法是什么? Map 应该在对象中创建还是在单独的类中创建?或者,最好在 ProcessSales 类中创建一个将使用它的对象?

您能分享最佳实践和示例吗?

object SalesData {

  val stream : InputStream = getClass.getResourceAsStream("/sales.csv")
  val salesIterator: Iterator[String] = scala.io.Source.fromInputStream(stream).getLines

  def getSales(salesData: Iterator[String]): Map[Int, String] = {
    salesData
      .map(_.split(","))
      .map(line => (line(0).toInt, line(1)))
      .toMap
  }

  val salesMap: Map[Int, String] = getSales(salesIterator)
}

【问题讨论】:

  • import SalesData.salesMap

标签: scala collections


【解决方案1】:

如果您想灵活地“混入”此地图,您可以将地图和 getSales() 放入一个新特征中。

另一方面,如果您想确保存在一个且只有一个工厂方法来创建地图,您可以将 getSales() 放入一个伴生对象中,该对象必须与您的类同名并定义在相同的源文件。例如,

object ProcessSales { 

 def getSales():Map[Int,String] =  {...}

}

请记住,伴生对象中的方法类似于 Java 中的静态方法。

如果您希望地图成为单例,也可以将地图实例本身放入伴随对象中——每个 ProcessSales 实例一个地图实例。

或者,如果您希望每个 ProcessSales 实例有 1 个这样的映射,您可以将其设为 ProcessSales 类中的一个字段。

或者,如果您希望该映射可供 ProcessSales 下的类层次结构的所有成员使用,您可以将 ProcessSales 设为抽象类。但是关于抽象类的使用,请记住,如果您不确定层次结构中的所有子类都需要映射,则使用特征提供了更大的灵活性。

【讨论】:

    【解决方案2】:

    这完全取决于您想如何使用它。 Scala 更注重功能。因此,为了获得最佳实践,您可以在一个对象中定义 getSalesData,在另一个对象中您可以传递参数并调用 def getSalesData。

    例如,

    import packaganame.SalesData._;
    
    Object Check {
    
       val stream : InputStream = getClass.getResourceAsStream("/sales.csv");
       val salesIterator: Iterator[String] = scala.io.Source.fromInputStream(stream).getLines;
    
       val salesMap = getSales(salesIterator);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 2011-04-18
      相关资源
      最近更新 更多