對於斯卡拉開發人員,在這裏它是執行全掃描和使用官方地圖的AmazonS3桶的內容遞歸函數AWS SDK for 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 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