Для разработчиков Scala здесь это рекурсивная функция для выполнения полного сканирования и сопоставления содержимого корзины AmazonS3 с использованием официального AWS SDK для Java
import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest}
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}
def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = {
def scan(acc:List[T], listing:ObjectListing): List[T] = {
val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries())
val mapped = (for (summary <- summaries) yield f(summary)).toList
if (!listing.isTruncated) mapped.toList
else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing))
}
scan(List(), s3.listObjects(bucket, prefix))
}
Чтобы вызвать вышеупомянутую каррированную функцию map()
, просто передайте уже созданный (и правильно инициализированный) объект AmazonS3Client (см. Официальный AWS SDK для Java API Reference ), имя корзины и префикс имя в первом списке параметров. Также передайте функцию f()
, которую вы хотите применить для сопоставления каждой сводки объекта во втором списке параметров.
Например
val keyOwnerTuples = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner))
вернет полный список (key, owner)
кортежей в этом сегменте / префиксе
или
map(s3, "bucket", "prefix")(s => println(s))
как вы обычно подходите к Монадам в функциональном программировании