Scala:如何处理列表中的对象

时间:2019-01-28 23:12:20

标签: scala

我在jdk1.8上使用spark和scala。我是Scala的新手。 我正在收集对象列表:

val externalEntities  =  getExternalGenericExtractFiles()

该函数返回(来自Java世界):

public List<GenericExtractExternalEntity> getExternalGenericExtractFiles()
{
    return externalGenericExtractFiles;
}

现在我正在尝试:

externalEntities.forEach( externalEntity =>
  sqlContext.read.format(externalEntity.getExtractfileType)
    .option("compression", externalEntity.getCompressionCodec)
    .option("delimiter", externalEntity.getExtractDelimiter)
    .option("header", if (externalEntity.getHasHeader.toUpperCase == "Y") "true" else "false")
    .load(externalEntity.getFilePath)
    .createOrReplaceTempView(externalEntity.getExtractName)
)

并出现错误:

error: missing parameter type
[ERROR]     externalEntities.forEach(externalEntity =>

我认为Scala可以推断类型。我在这里想念什么?

如果我只尝试列表中的一个对象,那看起来就像我这样做

val externalEntity=  getExternalGenericExtractFiles().get(0)

sqlContext.read.format(externalEntity.getExtractfileType)
    .option("compression", externalEntity.getCompressionCodec)
    .option("delimiter", externalEntity.getExtractDelimiter)
    .option("header", if (externalEntity.getHasHeader.toUpperCase == "Y") "true" else "false")
    .load(externalEntity.getFilePath)
    .createOrReplaceTempView(externalEntity.getExtractName)

我可以对正在发生的事情和/或如何解决有任何见解吗? 预先感谢

2 个答案:

答案 0 :(得分:3)

我假设您没有使用Scala 2.12。将Scala lambda与Java功能接口一起使用需要Scala 2.12。当您传递不期望输入的lambda时,通常会出现该错误消息,这种情况在2.11中会发生。升级您的Scala版本或convert the list to a Scala list

答案 1 :(得分:0)

我有一个错字(“ forEach”而不是“ foreach”),并且需要一点额外的东西:

import scala.collection.JavaConverters._

val externalEntities:List[GenericExtractExternalEntity]  =  
                  getExternalGenericExtractFiles()
                  .asScala
                  .iterator
                  .toList

externalEntities.foreach ( externalEntity =>
  sqlContext.read.format(externalEntity.getExtractfileType)
    .option("compression", externalEntity.getCompressionCodec)
    .option("delimiter", externalEntity.getExtractDelimiter)
    .option("header", if (externalEntity.getHasHeader.toUpperCase == "Y") "true" else "false")
    .load(externalEntity.getFilePath)
    .createOrReplaceTempView(externalEntity.getExtractName)
)

而且有效。