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 リファレンスを参照)、バケット名、およびプレフィックス名を最初のパラメータ リストに渡すだけです。またf()
、2 番目のパラメーター リストで各オブジェクトの概要をマップするために適用する関数を渡します。
例えば
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()
によって通常アプローチするように、他の多くの関数と組み合わせることができます