S3ObjectSummmary не может вызвать функцию - PullRequest
0 голосов
/ 06 июня 2019

Я очень новичок в 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())

Ошибка: значение getKey не является членом Object. На самом деле я использую IntelliJ, и ide также говорит, что нет метода getKey для s3Obsummary.

Предполагается, что элементы в массиве являются объектом S3ObjectSummmary, но не могут вызывать такую ​​функцию, как getKey (). Это, должно быть, очень простая проблема, но я не нашел, где проблема.

1 Ответ

2 голосов
/ 06 июня 2019

Ошибка на самом деле довольно проста.
Он находится в части toArray(). Если вы посмотрите на документацию , она скажет, что возвращает Array[AnyRef] (Object[] в 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])
...