代码之家  ›  专栏  ›  技术社区  ›  samba

scala-如何从类访问对象?

  •  0
  • samba  · 技术社区  · 6 年前

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

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

    从另一个类访问映射的正确方法是什么? 映射应该在对象中创建还是在单独的类中创建?或者最好在 加工销售 将要使用它的类?

    你能分享一下最佳实践和例子吗?

    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 回复  |  直到 6 年前
        1
  •  1
  •   Ben Weaver    6 年前

    如果你想灵活地“混合”这个地图,你可以把地图和GETSales()放到一个新的特性中。

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

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

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

    如果您希望映射是单例的话,也可以将映射实例本身放入相应的对象中——每多个processsales实例一个映射实例。

    或者,如果您希望每一个processsales实例都有一个这样的映射,那么您可以使它成为processsales类中的一个字段。

    或者,如果您希望映射对processsales下的类层次结构的所有成员都可用,那么可以将processsales作为一个抽象类。但是,对于抽象类的使用,请记住,在不确定层次结构中的所有子类都需要映射的情况下,使用特性可以提供更大的灵活性。

        2
  •  0
  •   Jay Vignesh    6 年前

    这完全取决于你想如何使用它。scala更注重功能。因此,对于最佳实践,可以在一个对象中定义getsalesdata,在另一个对象中,可以传递参数并调用defgetsalesdata。

    例如,

    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);
    
    }