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])
我是 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])