Stronicowanie i iteracja w zestawie Azure SDK dla języka Java
Ten artykuł zawiera omówienie sposobu korzystania z zestawu Azure SDK dla języka Java stronicowania i iteracji w celu wydajnej i wydajnej pracy z dużymi zestawami danych.
Wiele operacji udostępnianych przez biblioteki klienckie w zestawie Azure Java SDK zwraca więcej niż jeden wynik. Zestaw Sdk języka Java platformy Azure definiuje zestaw akceptowalnych typów zwracanych w tych przypadkach, aby zapewnić zmaksymalizowanie środowiska dewelopera dzięki spójności. Używane typy zwracane są PagedIterable
dla interfejsów API synchronizacji i PagedFlux
dla asynchronicznych interfejsów API. Interfejsy API różnią się nieco w zależności od ich różnych przypadków użycia, ale koncepcyjnie mają te same wymagania:
Umożliwia łatwe iterowanie poszczególnych elementów w kolekcji indywidualnie, ignorując konieczność ręcznego stronicowania lub śledzenia tokenów kontynuacji. Zarówno
PagedIterable
zadanie, jak iPagedFlux
ułatwia iterowanie w przypadku deserializacji odpowiedzi podzielonej na strony w danym typieT
.PagedIterable
implementujeIterable
interfejs i oferuje interfejs API do odbieraniaStream
elementu , a elementPagedFlux
udostępnia elementFlux
. We wszystkich przypadkach działanie stronicowania jest przezroczyste, a iteracja jest kontynuowana, gdy nadal są wyniki iteracji.Umożliwia jawne iterowanie strony po stronie. Dzięki temu można lepiej zrozumieć, kiedy są wykonywane żądania, i umożliwia dostęp do informacji o odpowiedzi na strony. Obie
PagedIterable
metodyPagedFlux
i mają metody, które zwracają odpowiednie typy, aby iterować według strony, a nie według poszczególnych elementów.
Ten artykuł jest podzielony między synchroniczne i asynchroniczne interfejsy API zestawu Azure SDK dla języka Java. Interfejsy API iteracji synchronicznej będą widoczne podczas pracy z klientami synchronicznymi i asynchronicznymi interfejsami API iteracji podczas pracy z klientami asynchronicznymi.
Synchroniczne stronicowanie i iteracja
W tej sekcji omówiono synchroniczne interfejsy API.
Iterowanie poszczególnych elementów
Jak wspomniano, najczęstszym przypadkiem użycia jest iteracja poszczególnych elementów zamiast na stronę. W poniższych przykładach kodu pokazano, jak PagedIterable
interfejs API umożliwia użycie stylu iteracji, który chcesz zaimplementować w celu zaimplementowania tej funkcji.
Używanie pętli for-each
Ponieważ PagedIterable
implementuje Iterable
element , można iterować po elementach, jak pokazano w poniższym przykładzie:
PagedIterable<Secret> secrets = client.listSecrets();
for (Secret secret : secrets) {
System.out.println("Secret is: " + secret);
}
Korzystanie z usługi Stream
Ponieważ PagedIterable
ma zdefiniowaną na nim metodę stream()
, można ją wywołać, aby używać standardowych interfejsów API usługi Java Stream, jak pokazano w poniższym przykładzie:
client.listSecrets()
.stream()
.forEach(secret -> System.out.println("Secret is: " + secret));
Korzystanie z iteratora
Ponieważ PagedIterable
implementuje Iterable
element , ma również metodę iterator()
zezwalania na styl programowania iteratora Java, jak pokazano w poniższym przykładzie:
Iterator<Secret> secrets = client.listSecrets().iterator();
while (it.hasNext()) {
System.out.println("Secret is: " + it.next());
}
Iterowanie na stronach
Podczas pracy z poszczególnymi stronami można iterować na stronę, na przykład gdy potrzebne są informacje o odpowiedzi HTTP lub gdy tokeny kontynuacji są ważne, aby zachować historię iteracji. Niezależnie od tego, czy iterujesz według strony, czy poszczególnych elementów, nie ma różnicy w wydajności lub liczbie wywołań wykonanych w usłudze. Podstawowa implementacja ładuje następną stronę na żądanie, a jeśli anulujesz subskrypcję w PagedFlux
dowolnym momencie, nie ma dalszych wywołań usługi.
Używanie pętli for-each
Po wywołaniu listSecrets()
metody otrzymasz PagedIterable
element , który ma iterableByPage()
interfejs API. Ten interfejs API tworzy element Iterable<PagedResponse<Secret>>
zamiast Iterable<Secret>
. Element PagedResponse
udostępnia metadane odpowiedzi i dostęp do tokenu kontynuacji, jak pokazano w poniższym przykładzie:
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))
}
Istnieje również iterableByPage
przeciążenie, które akceptuje token kontynuacji. To przeciążenie można wywołać, gdy chcesz wrócić do tego samego punktu iteracji w późniejszym czasie.
Korzystanie z usługi Stream
W poniższym przykładzie pokazano, jak streamByPage()
metoda wykonuje tę samą operację, jak pokazano powyżej. Ten interfejs API ma również przeciążenie tokenu kontynuacji do powrotu do tego samego punktu iteracji w późniejszym czasie.
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))
});
Asynchronicznie obserwuj strony i poszczególne elementy
W tej sekcji omówiono asynchroniczne interfejsy API. W asynchronicznych interfejsach API wywołania sieciowe są wykonywane w innym wątku niż główny wątek, który wywołuje metodę subscribe()
. Oznacza to, że główny wątek może zakończyć się przed udostępnieniem wyniku. Należy upewnić się, że aplikacja nie kończy działania przed ukończeniem operacji asynchronicznych.
Obserwowanie poszczególnych elementów
W poniższym przykładzie PagedFlux
pokazano, jak interfejs API umożliwia asynchroniczne obserwowanie poszczególnych elementów. Istnieją różne sposoby subskrybowania typu Flux. Aby uzyskać więcej informacji, zobacz Simple Ways to Create a Flux or Mono and Subscribe to It in the Reactor 3 Reference Guide (Proste sposoby tworzenia strumienia lub mono i subskrybowania go w przewodniku referencyjnym reactor 3). Ten przykład jest jedną odmianą, w której istnieją trzy wyrażenia lambda, po jednym dla konsumenta, konsument błędu i kompletny konsument. Posiadanie wszystkich trzech jest dobrym rozwiązaniem, ale w niektórych przypadkach konieczne jest posiadanie konsumenta i ewentualnie konsumenta błędu.
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"));
Obserwowanie stron
W poniższym przykładzie pokazano, jak PagedFlux
interfejs API umożliwia obserwowanie każdej strony asynchronicznie, przy użyciu interfejsu byPage()
API oraz dostarczanie konsumenta, odbiorcy błędów i odbiorcy uzupełniania.
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"));
Następne kroki
Teraz, gdy znasz stronicowanie i iterację w zestawie Azure SDK dla języka Java, rozważ przejrzenie długotrwałych operacji w zestawie Azure SDK dla języka Java. Długotrwałe operacje to operacje, które działają przez dłuższy czas niż większość normalnych żądań HTTP, zazwyczaj dlatego, że wymagają pewnego nakładu pracy po stronie serwera.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla