对于 Scala 开发人员,这里是递归函数,使用官方 AWS SDK for Java
对 AmazonS3 存储桶的内容执行
完整扫描和映射
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 for Java API Reference)、存储桶名称和前缀名称。还要传递你要应用的函数f()来映射第二个参数列表中的每个对象摘要。
例如
val tuple = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner, s.getSize))
将返回该桶/前缀中 (key, owner, size) 元组的完整列表
或
val totalSize = map(s3, "bucket", "prefix")(s => s.getSize).sum
将返回其内容的总大小(注意在表达式末尾应用的附加 sum() 折叠函数 ;-)
您可以将map() 与许多其他功能结合起来,就像您通常通过Monads in Functional Programming 处理的那样