Scala-如何从类访问对象?

时间:2018-07-16 12:49:57

标签: scala collections

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

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

从另一个类访问Map的正确方法是什么? 应该在对象中还是在单独的类中创建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)
}

2 个答案:

答案 0 :(得分:1)

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

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

object ProcessSales { 

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

}

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

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

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

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

答案 1 :(得分:0)

这完全取决于您要如何使用它。 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);

}