我想用一个类(对象)中的销售信息创建一个映射,并在另一类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)
}
答案 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);
}