我对scala还是很陌生,我试图根据s3中的存储桶名称提取文件名列表。这是我的代码:
val basicCredentials = new AWSStaticCredentialsProvider(new BasicAWSCredentials(awsAccessKeyId, awsSecretAccessKey))
val s3 = AmazonS3ClientBuilder.standard()
.withCredentials(basicCredentials)
.build()
val res = s3.listObjects("myBucket").getObjectSummaries().toArray()
val filename = res.map(s3ObSummary => s3ObSummary.getKey())
错误是:value getKey不是Object的成员。实际上,我正在使用IntelliJ,并且该ide也说没有s3Obsummary的getKey方法。
该数组中的元素应该是S3ObjectSummmary对象,但无法调用类似getKey()的函数。这肯定是一个非常简单的问题,但我没有找到问题所在。
答案 0 :(得分:2)
错误实际上非常简单。
它在toArray()
部分中。
如果您查看文档,它会返回Array[AnyRef]
(Java中的Object[]
)。因此,您丢失了它的类型。
有很多解决此问题的方法,例如:
1)使用asIsntanceOf
(不推荐!!!)。
val filename = res.map(s3ObSummary => s3ObSummary.asIsntanceOf[S3ObjectSummary].getKey())
2)结合使用{strong>模式匹配和collect
(与上面相同,但更安全)。
val filename = res.collect { case s3ObSummary: S3ObjectSummary => s3ObSummary.getKey() }
3)或者,根据我的个人喜好,使用JavaConverters。
import scala.collection.JavaConverters._ // Provides the asScala extension method.
val basicCredentials = new AWSStaticCredentialsProvider(new BasicAWSCredentials(awsAccessKeyId, awsSecretAccessKey))
val s3 = AmazonS3ClientBuilder.standard()
.withCredentials(basicCredentials)
.build()
val res = s3.listObjects("myBucket").getObjectSummaries().asScala
val filename = res.map(s3ObSummary => s3ObSummary.getKey())
4)如@AlexeyRomanov所建议。使用正确的toArray(T[])
格式。
val res = s3.listObjects("myBucket").getObjectSummaries().toArray(Array.empty[S3ObjectSummary])