如何从其他Scala文件访问计算数据?

nnt7mjpx  于 2022-11-09  发布在  Scala
关注(0)|答案(1)|浏览(172)

我需要从Calculation.scala访问此数据mapData。我在Final.scala中调用函数的方式如下所示。
当我看到FETCH_DATA()的输出或打印它时,我会看到Future(<未完成>),而Result是空的。我不知道如何等到下载完所有数据后再访问mapData?我可以知道怎么做吗?我是Scala的新手。在C++中,我知道回调,在那里处理起来很容易。但在Scala中,我使用了Future、AWait或OnComplete,但不清楚如何做到这一点。

Final.Scala   

    object finalComputation {

     val calculationInfo = new Calculaton()

     calclulationInfo.fetch_data()

     val result = calculationInfo.getMapData()

     def main(args: Array[String]): Unit = {
      ........
     }
    }

 Calculation.scala

    class Calculation {

     var mapData = Map.empty[String, String]

     def createMapData(metricItem: ActualMetrics) = {
        mapData += (metricItem._1  -> metricItem._2)
     }

     def getMapData() = {
       mapData 
     }

     def fetch_data() = {
     val totalData: Future[Done] =
       querApi
         .getData()
            .map { data =>
            (data)
           }
       }
     }

    Await.result(totalData, Duration.Inf).runForeach(unit => {
     createMapData(parse.From(totalData))
  })
  }
  }
lx0bsm1f

lx0bsm1f1#

首先,不要把并发性和可变性混为一谈。
其次,不要创建需要特定调用顺序的命令式API。
第三,Future只是回调的花哨 Package 器。
第四,不要在main之前启动计算

// file: Calculation.scala
class Calculation(queryApi: Api) {
  def fetchData(): Future[Map[String, String]] =
    querApi.getData().map { data =>
      data.view.map { metric =>
        val ActualMetrics(key, value) = parse(metric)
        key -> value
      }.toMap
    }
}

// file: Main.scala
object Main {
  def main(args: Array[String]): Unit = {
    val calculation = new Calculation(...)
    val dataF = calculation.fetchData()
    val result = dataF.map { data =>
        // Here you can process the fetched data
        // It may be flatMap or foreach, instead of map;
        // depending on what you want to do, check the Scaladoc
    }

    // I don't use future, but I think here you need to do a final await of result.
    // In order to avoid the program to finish before the async computation.
  }
}

我不得不假设一些类型,但我希望这能给你一个大体的想法。
我的建议是,选择任何Scala课程/书籍/教程,并适当地学习这门语言。

相关问题