

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menggunakan hasil paginasi di 2.x AWS SDK untuk Java
<a name="pagination"></a>

Banyak AWS operasi mengembalikan hasil paginasi ketika objek respons terlalu besar untuk dikembalikan dalam satu respons. Di AWS SDK untuk Java 1.0, respons berisi token yang Anda gunakan untuk mengambil halaman hasil berikutnya. Sebaliknya, AWS SDK untuk Java 2.x memiliki metode autopagination yang membuat beberapa panggilan layanan untuk mendapatkan halaman hasil berikutnya untuk Anda secara otomatis. Anda hanya perlu menulis kode yang memproses hasilnya. Autopagination tersedia untuk klien sinkron dan asinkron.

**catatan**  
Cuplikan kode ini mengasumsikan bahwa Anda memahami [dasar-dasar penggunaan SDK](using.md), dan telah mengonfigurasi lingkungan Anda dengan akses masuk [tunggal](get-started-auth.md#setup-credentials).

## pagination sinkron
<a name="synchronous-pagination"></a>

Contoh berikut menunjukkan metode pagination sinkron untuk mencantumkan objek Amazon S3 dalam bucket.

### Iterasi di atas halaman
<a name="iterate-pages"></a>

Contoh pertama menunjukkan penggunaan objek `listRes` paginator, sebuah [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/paginators/ListObjectsV2Iterable.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/paginators/ListObjectsV2Iterable.html)contoh, untuk iterasi melalui semua halaman respon dengan metode. `stream` Kode mengalir di atas halaman respons, mengubah aliran respons menjadi aliran `[S3Object](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/model/S3Object.html)` konten, dan kemudian memproses konten objek. Amazon S3 

Impor berikut berlaku untuk semua contoh di bagian pagination sinkron ini.

#### Impor
<a name="synchronous-pagination-ex-import"></a>

```
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Random;

import software.amazon.awssdk.core.waiters.WaiterResponse;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Iterable;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;
import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;
import software.amazon.awssdk.services.s3.model.S3Object;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.DeleteObjectRequest;
import software.amazon.awssdk.services.s3.model.DeleteBucketRequest;
import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest;
import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse;
import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload;
import software.amazon.awssdk.services.s3.model.CreateBucketRequest;
import software.amazon.awssdk.services.s3.model.CompletedPart;
import software.amazon.awssdk.services.s3.model.CreateBucketConfiguration;
import software.amazon.awssdk.services.s3.model.UploadPartRequest;
import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest;
import software.amazon.awssdk.services.s3.waiters.S3Waiter;
import software.amazon.awssdk.services.s3.model.HeadBucketRequest;
import software.amazon.awssdk.services.s3.model.HeadBucketResponse;
```

```
        ListObjectsV2Request listReq = ListObjectsV2Request.builder()
            .bucket(bucketName)
            .maxKeys(1)
            .build();

        ListObjectsV2Iterable listRes = s3.listObjectsV2Paginator(listReq);
        // Process response pages
        listRes.stream()
            .flatMap(r -> r.contents().stream())
            .forEach(content -> System.out
                .println(" Key: " + content.key() + " size = " + content.size()));
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/blob/f807d60010caf3d14fe4cd0801b842fb8e9511ca/javav2/example_code/s3/src/main/java/com/example/s3/S3ObjectOperations.java#L112) di GitHub.

### Iterasi di atas objek
<a name="iterate-objects"></a>

Contoh berikut menunjukkan cara untuk mengulangi objek yang dikembalikan dalam respons, bukan halaman respons. `contents`Metode `ListObjectsV2Iterable` kelas mengembalikan sebuah [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/pagination/sync/SdkIterable.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/pagination/sync/SdkIterable.html)yang menyediakan beberapa metode untuk memproses elemen konten yang mendasarinya.

#### Gunakan aliran
<a name="use-a-stream"></a>

Cuplikan berikut menggunakan `stream` metode pada konten respons untuk mengulangi koleksi item paginasi.

```
        // Helper method to work with paginated collection of items directly.
        listRes.contents().stream()
            .forEach(content -> System.out
                .println(" Key: " + content.key() + " size = " + content.size()));
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/blob/f807d60010caf3d14fe4cd0801b842fb8e9511ca/javav2/example_code/s3/src/main/java/com/example/s3/S3ObjectOperations.java#L127) di GitHub.

#### Gunakan untuk setiap loop
<a name="for-loop"></a>

Karena `SdkIterable` memperluas `Iterable` antarmuka, Anda dapat memproses konten seperti apa pun`Iterable`. Cuplikan berikut menggunakan `for-each` loop standar untuk iterasi melalui isi respon.

```
        for (S3Object content : listRes.contents()) {
            System.out.println(" Key: " + content.key() + " size = " + content.size());
        }
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/blob/f807d60010caf3d14fe4cd0801b842fb8e9511ca/javav2/example_code/s3/src/main/java/com/example/s3/S3ObjectOperations.java#L133) di GitHub.

### Pagination manual
<a name="manual-pagination"></a>

Jika kasus penggunaan Anda memerlukannya, pagination manual masih tersedia. Gunakan token berikutnya di objek respons untuk permintaan berikutnya. Contoh berikut menggunakan `while` loop.

```
        ListObjectsV2Request listObjectsReqManual = ListObjectsV2Request.builder()
            .bucket(bucketName)
            .maxKeys(1)
            .build();

        boolean done = false;
        while (!done) {
            ListObjectsV2Response listObjResponse = s3.listObjectsV2(listObjectsReqManual);
            for (S3Object content : listObjResponse.contents()) {
                System.out.println(content.key());
            }

            if (listObjResponse.nextContinuationToken() == null) {
                done = true;
            }

            listObjectsReqManual = listObjectsReqManual.toBuilder()
                .continuationToken(listObjResponse.nextContinuationToken())
                .build();
        }
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/blob/f807d60010caf3d14fe4cd0801b842fb8e9511ca/javav2/example_code/s3/src/main/java/com/example/s3/S3ObjectOperations.java#L90) di GitHub.

## pagination asinkron
<a name="asynchronous-pagination"></a>

Contoh berikut menunjukkan metode pagination asinkron untuk daftar tabel. DynamoDB 

### Ulangi halaman nama tabel
<a name="iterate-pages-async"></a>

Dua contoh berikut menggunakan klien DynamoDB asinkron yang memanggil metode dengan permintaan `listTablesPaginator` untuk mendapatkan file. [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/dynamodb/paginators/ListTablesPublisher.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/dynamodb/paginators/ListTablesPublisher.html) `ListTablesPublisher`mengimplementasikan dua antarmuka, yang menyediakan banyak opsi untuk memproses respons. Kita akan melihat metode masing-masing antarmuka.

#### Gunakan `Subscriber`
<a name="use-a-subscriber"></a>

Contoh kode berikut menunjukkan bagaimana memproses hasil paginasi dengan menggunakan `org.reactivestreams.Publisher` antarmuka yang diimplementasikan oleh. `ListTablesPublisher` Untuk mempelajari lebih lanjut tentang model aliran reaktif, lihat repo [Reactive](https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.2/README.md) Streams. GitHub 

Impor berikut berlaku untuk semua contoh di bagian pagination asinkron ini.

##### Impor
<a name="use-a-subscriber-ex-imports"></a>

```
import io.reactivex.rxjava3.core.Flowable;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import reactor.core.publisher.Flux;
import software.amazon.awssdk.core.async.SdkPublisher;
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;
import software.amazon.awssdk.services.dynamodb.model.ListTablesResponse;
import software.amazon.awssdk.services.dynamodb.paginators.ListTablesPublisher;

import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
```

Kode berikut memperoleh sebuah `ListTablesPublisher` instance.

```
        // Creates a default client with credentials and region loaded from the
        // environment.
        final DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create();

        ListTablesRequest listTablesRequest = ListTablesRequest.builder().limit(3).build();
        ListTablesPublisher publisher = asyncClient.listTablesPaginator(listTablesRequest);
```

Kode berikut menggunakan implementasi anonim `org.reactivestreams.Subscriber` untuk memproses hasil untuk setiap halaman.

`onSubscribe`Metode ini memanggil `Subscription.request` metode untuk memulai permintaan data dari penerbit. Metode ini harus dipanggil untuk mulai mendapatkan data dari penerbit. 

`onNext`Metode pelanggan memproses halaman respons dengan mengakses semua nama tabel dan mencetak masing-masing. Setelah halaman diproses, halaman lain diminta dari penerbit. Metode ini dipanggil berulang kali sampai semua halaman diambil.

`onError`Metode ini dipicu jika terjadi kesalahan saat mengambil data. Akhirnya, `onComplete` metode ini dipanggil ketika semua halaman telah diminta.

```
        // A Subscription represents a one-to-one life-cycle of a Subscriber subscribing
        // to a Publisher.
        publisher.subscribe(new Subscriber<ListTablesResponse>() {
            // Maintain a reference to the subscription object, which is required to request
            // data from the publisher.
            private Subscription subscription;

            @Override
            public void onSubscribe(Subscription s) {
                subscription = s;
                // Request method should be called to demand data. Here we request a single
                // page.
                subscription.request(1);
            }

            @Override
            public void onNext(ListTablesResponse response) {
                response.tableNames().forEach(System.out::println);
                // After you process the current page, call the request method to signal that
                // you are ready for next page.
                subscription.request(1);
            }

            @Override
            public void onError(Throwable t) {
                // Called when an error has occurred while processing the requests.
            }

            @Override
            public void onComplete() {
                // This indicates all the results are delivered and there are no more pages
                // left.
            }
        });
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/blob/f807d60010caf3d14fe4cd0801b842fb8e9511ca/javav2/example_code/dynamodbasync/src/main/java/com/example/dynamodbasync/AsyncPagination.java#L83) di GitHub.

#### Gunakan `Consumer`
<a name="id1pagination"></a>

`SdkPublisher`Antarmuka yang `ListTablesPublisher` mengimplementasikan memiliki `subscribe` metode yang mengambil `Consumer` dan mengembalikan a`CompletableFuture<Void>`. 

`subscribe`Metode dari antarmuka ini dapat digunakan untuk kasus penggunaan sederhana ketika overhead `org.reactivestreams.Subscriber` mungkin terlalu banyak. Karena kode di bawah ini menghabiskan setiap halaman, ia memanggil `tableNames` metode pada masing-masing halaman. `tableNames`Metode mengembalikan nama tabel DynamoDB yang diproses dengan metode. `java.util.List` `forEach`

```
        // Use a Consumer for simple use cases.
        CompletableFuture<Void> future = publisher.subscribe(
                response -> response.tableNames()
                        .forEach(System.out::println));
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/blob/f807d60010caf3d14fe4cd0801b842fb8e9511ca/javav2/example_code/dynamodbasync/src/main/java/com/example/dynamodbasync/AsyncPagination.java#L96) di GitHub.

### Ulangi nama tabel
<a name="iterate-objects-async"></a>

Contoh berikut menunjukkan cara untuk mengulangi objek yang dikembalikan dalam respons, bukan halaman respons. Mirip dengan contoh Amazon S3 sinkron yang sebelumnya ditampilkan dengan `contents` metodenya, kelas hasil asinkron DynamoDB`ListTablesPublisher`, memiliki `tableNames` metode kenyamanan untuk berinteraksi dengan koleksi item yang mendasarinya. Jenis pengembalian `tableNames` metode adalah [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/async/SdkPublisher.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/async/SdkPublisher.html)yang dapat digunakan untuk meminta item di semua halaman.

#### Gunakan `Subscriber`
<a name="id2"></a>

Kode berikut memperoleh koleksi `SdkPublisher` yang mendasari nama tabel.

```
        // Create a default client with credentials and region loaded from the
        // environment.
        final DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create();

        ListTablesRequest listTablesRequest = ListTablesRequest.builder().limit(3).build();
        ListTablesPublisher listTablesPublisher = asyncClient.listTablesPaginator(listTablesRequest);
        SdkPublisher<String> publisher = listTablesPublisher.tableNames();
```

Kode berikut menggunakan implementasi anonim `org.reactivestreams.Subscriber` untuk memproses hasil untuk setiap halaman.

`onNext`Metode pelanggan memproses elemen individual dari koleksi. Dalam hal ini, itu adalah nama tabel. Setelah nama tabel diproses, nama tabel lain diminta dari penerbit. Metode ini dipanggil berulang kali sampai semua nama tabel diambil.

```
        // Use a Subscriber.
        publisher.subscribe(new Subscriber<String>() {
            private Subscription subscription;

            @Override
            public void onSubscribe(Subscription s) {
                subscription = s;
                subscription.request(1);
            }

            @Override
            public void onNext(String tableName) {
                System.out.println(tableName);
                subscription.request(1);
            }

            @Override
            public void onError(Throwable t) {
            }

            @Override
            public void onComplete() {
            }
        });
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/blob/f807d60010caf3d14fe4cd0801b842fb8e9511ca/javav2/example_code/dynamodbasync/src/main/java/com/example/dynamodbasync/AsyncPagination.java#L147) di GitHub.

#### Gunakan `Consumer`
<a name="for-loop-async"></a>

Contoh berikut menggunakan `subscribe` metode `SdkPublisher` yang membutuhkan a `Consumer` untuk memproses setiap item.

```
        // Use a Consumer.
        CompletableFuture<Void> future = publisher.subscribe(System.out::println);
        future.get();
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/blob/f807d60010caf3d14fe4cd0801b842fb8e9511ca/javav2/example_code/dynamodbasync/src/main/java/com/example/dynamodbasync/AsyncPagination.java#L161) di GitHub.

### Gunakan pustaka pihak ketiga
<a name="use-third-party-library"></a>

Anda dapat menggunakan pustaka pihak ketiga lainnya alih-alih menerapkan pelanggan khusus. Contoh ini menunjukkan penggunaan RxJava, tetapi pustaka apa pun yang mengimplementasikan antarmuka aliran reaktif dapat digunakan. Lihat [halaman RxJava wiki GitHub](https://github.com/ReactiveX/RxJava/wiki) untuk informasi lebih lanjut tentang perpustakaan itu.

Untuk menggunakan perpustakaan, tambahkan sebagai dependensi. Jika menggunakan Maven, contoh menunjukkan cuplikan POM untuk digunakan.

 **Entri POM** 

```
<dependency>
      <groupId>io.reactivex.rxjava3</groupId>
      <artifactId>rxjava</artifactId>
      <version>3.1.6</version>
</dependency>
```

 **Kode** 

```
        DynamoDbAsyncClient asyncClient = DynamoDbAsyncClient.create();
        ListTablesPublisher publisher = asyncClient.listTablesPaginator(ListTablesRequest.builder()
                .build());

        // The Flowable class has many helper methods that work with
        // an implementation of an org.reactivestreams.Publisher.
        List<String> tables = Flowable.fromPublisher(publisher)
                .flatMapIterable(ListTablesResponse::tableNames)
                .toList()
                .blockingGet();
        System.out.println(tables);
```

Lihat [contoh lengkapnya](https://github.com/awsdocs/aws-doc-sdk-examples/blob/f807d60010caf3d14fe4cd0801b842fb8e9511ca/javav2/example_code/dynamodbasync/src/main/java/com/example/dynamodbasync/AsyncPagination.java#L198) di GitHub.