適用於 Java 的 Azure SDK 中的分頁和反覆專案
本文概述如何使用適用於 Java 的 Azure SDK 分頁和反覆專案功能,在大型數據集上有效率且具生產力地運作。
Azure Java SDK 內用戶端連結庫所提供的許多作業都會傳回多個結果。 Azure Java SDK 在這些情況下會定義一組可接受的傳回類型,以確保開發人員體驗透過一致性最大化。 用於 PagedIterable
同步 API 和 PagedFlux
異步 API 的傳回型別。 API 因不同使用案例而稍有不同,但在概念上,它們具有相同的需求:
讓您可以輕鬆地逐一查看集合中的每個元素,忽略手動分頁或追蹤接續令牌的任何需求。 透過
PagedIterable
逐一查看已還原串行化為指定類型的T
分頁回應,讓PagedFlux
這項工作變得簡單。PagedIterable
會實作Iterable
介面,並提供 API 來接收Stream
,同時PagedFlux
提供Flux
。 在所有情況下,分頁的動作都是透明的,而反覆專案仍會繼續執行,同時仍會逐一查看結果。逐頁逐一查看。 這麼做可讓您更清楚地瞭解何時提出要求,並可讓您存取每頁回應資訊。
PagedIterable
和PagedFlux
都有方法,這些方法會傳回適當的類型逐頁逐一查看,而不是個別專案。
本文會在 Java Azure SDK 同步和異步 API 之間分割。 當您使用同步用戶端時,您會看到同步反覆運算 API,以及使用異步用戶端時的異步反覆運算 API。
同步分頁和反覆專案
本節涵蓋同步 API。
逐一查看個別元素
如前所述,最常見的使用案例是個別逐一查看每個元素,而不是逐頁逐一查看。 下列程式代碼範例示範 API 如何 PagedIterable
讓您使用您想要實作這項功能的反覆項目樣式。
使用 for-each 迴圈
因為 PagedIterable
實作 Iterable
,所以您可以逐一查看 元素,如下列範例所示:
PagedIterable<Secret> secrets = client.listSecrets();
for (Secret secret : secrets) {
System.out.println("Secret is: " + secret);
}
使用 Stream
因為 PagedIterable
有定義 stream()
的方法,所以您可以呼叫它以使用標準 Java Stream API,如下列範例所示:
client.listSecrets()
.stream()
.forEach(secret -> System.out.println("Secret is: " + secret));
使用 Iterator
由於 PagedIterable
會實作 Iterable
,因此它也具有 iterator()
允許 Java 反覆運算器程式設計樣式的方法,如下列範例所示:
Iterator<Secret> secrets = client.listSecrets().iterator();
while (it.hasNext()) {
System.out.println("Secret is: " + it.next());
}
逐一查看頁面
當您使用個別頁面時,您可以逐一查看每頁,例如當您需要 HTTP 回應資訊,或當接續令牌對於保留反覆專案歷程記錄很重要時。 無論您逐頁逐一查看或逐一查看每個專案,效能還是服務呼叫次數都沒有任何差異。 基礎實作會視需要載入下一頁,如果您隨時取消訂閱 PagedFlux
,則不會再呼叫服務。
使用 for-each 迴圈
當您呼叫 listSecrets()
時,您會取得具有 PagedIterable
API 的 iterableByPage()
。 此 API 會產生 Iterable<PagedResponse<Secret>>
,而不是 Iterable<Secret>
。 PagedResponse
提供回應元數據和接續令牌的存取權,如下列範例所示:
Iterable<PagedResponse<Secret>> secretPages = client.listSecrets().iterableByPage();
for (PagedResponse<Secret> page : secretPages) {
System.out.println("Response code: " + page.getStatusCode());
System.out.println("Continuation Token: " + page.getContinuationToken());
page.getElements().forEach(secret -> System.out.println("Secret value: " + secret))
}
另外還有一個 iterableByPage
接受接續令牌的多載。 當您想要稍後回到相同的反覆項目點時,您可以呼叫此多載。
使用 Stream
下列範例示範 方法如何 streamByPage()
執行與上述相同的作業。 此 API 也有接續令牌多載,稍後會傳回相同的反覆項目點。
client.listSecrets()
.streamByPage()
.forEach(page -> {
System.out.println("Response code: " + page.getStatusCode());
System.out.println("Continuation Token: " + page.getContinuationToken());
page.getElements().forEach(secret -> System.out.println("Secret value: " + secret))
});
以異步方式觀察頁面和個別元素
本節涵蓋異步 API。 在異步 API 中,網路呼叫發生在與呼叫 subscribe()
的主要線程不同的線程中。 這表示主線程可能會在結果可用之前終止。 您必須確定應用程式在異步操作有時間完成之前不會結束。
觀察個別元素
下列範例示範 API 如何 PagedFlux
讓您以異步方式觀察個別元素。 有各種方式可以訂閱 Flux 類型。 如需詳細資訊,請參閱《反應器 3 參考指南》中的簡單建立 Flux 或 Mono 和訂閱它的方法。 此範例有一種不同,其中有三個 Lambda 運算式,一個用於取用者、錯誤取用者,以及完整的取用者。 擁有這三者都是很好的作法,但在某些情況下,只有擁有取用者,而且可能是錯誤的取用者。
asyncClient.listSecrets()
.subscribe(secret -> System.out.println("Secret value: " + secret),
ex -> System.out.println("Error listing secrets: " + ex.getMessage()),
() -> System.out.println("Successfully listed all secrets"));
觀察頁面
下列範例示範 API 如何 PagedFlux
讓您使用 byPage()
API 和提供取用者、錯誤取用者和完成取用者,以異步方式觀察每個頁面。
asyncClient.listSecrets().byPage()
.subscribe(page -> {
System.out.println("Response code: " + page.getStatusCode());
System.out.println("Continuation Token: " + page.getContinuationToken());
page.getElements().forEach(secret -> System.out.println("Secret value: " + secret))
},
ex -> System.out.println("Error listing pages with secret: " + ex.getMessage()),
() -> System.out.println("Successfully listed all pages with secret"));
下一步
現在您已熟悉適用於 Java 的 Azure SDK 中的分頁和反覆專案,請考慮在適用於 Java 的 Azure SDK 中檢閱長時間執行的作業。 長時間執行的作業是運行時間比大多數一般 HTTP 要求更長的作業,通常是因為它們需要伺服器端的一些工作。