Sidnumrering och iteration i Azure SDK för Java
Den här artikeln innehåller en översikt över hur du använder Azure SDK för Java-sidnumrering och iterationsfunktioner för att arbeta effektivt och produktivt med stora datamängder.
Många åtgärder som tillhandahålls av klientbiblioteken i Azure Java SDK returnerar mer än ett resultat. Azure Java SDK definierar en uppsättning godtagbara returtyper i dessa fall för att säkerställa att utvecklarupplevelsen maximeras genom konsekvens. De returtyper som används är PagedIterable
för synkroniserings-API:er och PagedFlux
för asynkrona API:er. API:erna skiljer sig något beroende på deras olika användningsfall, men begreppsmässigt har de samma krav:
Gör det möjligt att enkelt iterera över varje element i samlingen individuellt och ignorera eventuella behov av manuell sidnumrering eller spårning av fortsättningstoken. Både
PagedIterable
ochPagedFlux
gör den här uppgiften enkel genom att iterera över ett sidnumrerat svar som deserialiserats till en viss typT
.PagedIterable
implementerarIterable
gränssnittet och erbjuder ett API för att ta emot enStream
, medanPagedFlux
tillhandahåller enFlux
. I samtliga fall är sidnumreringen transparent och iterationen fortsätter medan det fortfarande finns resultat iterera över.Gör det möjligt att iterera explicit sida för sida. På så sätt kan du bättre förstå när begäranden görs och du kan komma åt svarsinformation per sida. Både
PagedIterable
ochPagedFlux
har metoder som returnerar lämpliga typer för att iterera efter sida, i stället för efter enskilda element.
Den här artikeln är uppdelad mellan Synkrona och asynkrona API:er för Java Azure SDK. Du ser synkrona iterations-API:er när du arbetar med synkrona klienter och asynkrona iterations-API:er när du arbetar med asynkrona klienter.
Synkron sidnumrering och iteration
Det här avsnittet beskriver synkrona API:er.
Iterera över enskilda element
Som nämnts är det vanligaste användningsfallet att iterera över varje element individuellt, snarare än per sida. Följande kodexempel visar hur API:et PagedIterable
låter dig använda iterationsformatet som du föredrar för att implementera den här funktionen.
Använda en for-each-loop
Eftersom PagedIterable
implementerar Iterable
kan du iterera genom elementen enligt följande exempel:
PagedIterable<Secret> secrets = client.listSecrets();
for (Secret secret : secrets) {
System.out.println("Secret is: " + secret);
}
Använda Stream
Eftersom PagedIterable
en stream()
metod har definierats för den kan du anropa den för att använda Java Stream-standard-API:er, som du ser i följande exempel:
client.listSecrets()
.stream()
.forEach(secret -> System.out.println("Secret is: " + secret));
Använda iterator
Eftersom PagedIterable
implementerar Iterable
har den också en iterator()
metod för att tillåta programmeringsstilen Java-iterator, vilket visas i följande exempel:
Iterator<Secret> secrets = client.listSecrets().iterator();
while (it.hasNext()) {
System.out.println("Secret is: " + it.next());
}
Iterera över sidor
När du arbetar med enskilda sidor kan du iterera per sida, till exempel när du behöver HTTP-svarsinformation eller när fortsättningstoken är viktiga för att behålla iterationshistoriken. Oavsett om du itererar efter sida eller varje objekt finns det ingen skillnad i prestanda eller antalet anrop som görs till tjänsten. Den underliggande implementeringen läser in nästa sida på begäran, och om du avregistrerar dig från den PagedFlux
när som helst finns det inga ytterligare anrop till tjänsten.
Använda en for-each-loop
När du anropar listSecrets()
får du en PagedIterable
, som har ett iterableByPage()
API. Det här API:et genererar en Iterable<PagedResponse<Secret>>
i stället för en Iterable<Secret>
. PagedResponse
Ger svarsmetadata och åtkomst till fortsättningstoken, som du ser i följande exempel:
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))
}
Det finns också en iterableByPage
överlagring som accepterar en fortsättningstoken. Du kan anropa den här överbelastningen när du vill återgå till samma iteration vid ett senare tillfälle.
Använda Stream
I följande exempel visas hur streamByPage()
metoden utför samma åtgärd som ovan. Det här API:et har också en fortsättningstokenöverlagring för att återgå till samma iterationsplats vid ett senare tillfälle.
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))
});
Observera sidor och enskilda element asynkront
Det här avsnittet beskriver asynkrona API:er. I asynkrona API:er sker nätverksanropen i en annan tråd än huvudtråden som anropar subscribe()
. Det innebär att huvudtråden kan avslutas innan resultatet är tillgängligt. Det är upp till dig att se till att programmet inte avslutas innan asynkroniseringsåtgärden har haft tid att slutföras.
Observera enskilda element
I följande exempel visas hur API:et PagedFlux
låter dig observera enskilda element asynkront. Det finns olika sätt att prenumerera på en Flux-typ. Mer information finns i Enkla sätt att skapa en flux eller mono och prenumerera på den i referensguiden för Reactor 3. Det här exemplet är en variant där det finns tre lambda-uttryck, ett var för konsumenten, felkonsumenten och den fullständiga konsumenten. Att ha alla tre är bra praxis, men i vissa fall är det bara nödvändigt att ha konsumenten, och eventuellt felkonsumenten.
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"));
Observera sidor
I följande exempel visas hur API:et PagedFlux
låter dig observera varje sida asynkront, igen med hjälp av ett byPage()
API och genom att tillhandahålla en konsument, felkonsument och en slutförande konsument.
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"));
Nästa steg
Nu när du är bekant med sidnumrering och iteration i Azure SDK för Java kan du överväga att granska långvariga åtgärder i Azure SDK för Java. Långvariga åtgärder är åtgärder som körs under en längre tid än de flesta vanliga HTTP-begäranden, vanligtvis eftersom de kräver viss ansträngning på serversidan.