S3ObjectSummmary无法调用函数

时间:2019-06-06 00:36:20

标签: scala amazon-s3 scala-java-interop

我对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()的函数。这肯定是一个非常简单的问题,但我没有找到问题所在。

1 个答案:

答案 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])