S3ObjectSummary 无法调用函数

S3ObjectSummmary not able to call function

我是 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() 之类的函数。应该是很简单的问题,但是没找到问题出在哪里

错误其实很简单。
它在 toArray() 部分。 如果您查看 文档 ,它会说 returns 一个 Array[AnyRef] Object[] in Java)。因此,您丢失了它的类型。

这个问题有很多解决方案,例如:

1) 使用asIsntanceOf (不推荐!!!).

val filename = res.map(s3ObSummary => s3ObSummary.asIsntanceOf[S3ObjectSummary].getKey())

2) 使用模式匹配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])