Hvordan returnere flere verdier fra en Java-metode

1. Oversikt

I denne opplæringen lærer vi forskjellige måter å returnere flere verdier fra en Java-metode.

Først returnerer vi matriser og samlinger. Deretter viser vi hvordan du bruker containerklasser for komplekse data og lærer hvordan du lager generiske tupleklasser.

Til slutt ser vi eksempler på hvordan du bruker tredjepartsbiblioteker for å returnere flere verdier.

2. Bruke matriser

Arrays kan brukes til å returnere både primitive og referansedatatyper.

For eksempel følgende getCoordinates metoden returnerer en matrise på to dobbelt verdier:

dobbel [] getCoordinatesDoubleArray () {dobbel [] koordinater = ny dobbel [2]; koordinater [0] = 10; koordinater [1] = 12,5; retur koordinater; }

Hvis vi vil returnere en matrise med forskjellige referansetyper, kan vi bruke en vanlig foreldretype som matrisenes type:

Number [] getCoordinatesNumberArray () {Number [] coordinates = new Number [2]; koordinater [0] = 10; // Heltallkoordinater [1] = 12,5; // Dobbel returkoordinater; }

Her har vi definert koordinater utvalg av typen Nummer fordi det er vanlig klasse mellom Heltall og Dobbelt elementer.

3. Bruke samlinger

Med generiske Java-samlinger, vi kan returnere flere verdier av en vanlig type.

Samlingsrammen har et bredt spekter av klasser og grensesnitt. Imidlertid vil vi i denne delen begrense diskusjonen til Liste og Kart grensesnitt.

3.1. Returnerende verdier av lignende type i en liste

Til å begynne med, la oss skrive det forrige matrixeksemplet om ved hjelp av Liste:

Liste getCoordinatesList () {List koordinater = ny ArrayList (); koordinater.add (10); // Heltallkoordinater.add (12.5); // Dobbel returkoordinater; }

Som Nummer[], den Liste samlingen inneholder en sekvens av blandede elementer som er av samme vanlige type.

3.2. Returnere navngitte verdier på et kart

Hvis vi vil gi navn til hver oppføring i samlingen vår, a Kart kan brukes i stedet:

Map getCoordinatesMap () {Map coordinates = new HashMap (); coordinates.put ("lengdegrad", 10); coordinates.put ("breddegrad", 12,5); returkoordinater; }

Brukere av getCoordinatesMap metoden kan bruke “lengdegrad ” eller “breddegrad" tastene med Kart # få metode for å hente den tilsvarende verdien.

4. Bruke beholderklasser

I motsetning til arrays og samlinger, containerklasser (POJOer) kan pakke inn flere felt med forskjellige datatyper.

For eksempel følgende Koordinater klassen har to forskjellige datatyper, dobbelt og String:

offentlig klasse Koordinater {privat dobbelt lengdegrad; privat dobbel breddegrad; private Stringnavn; offentlige koordinater (dobbel lengdegrad, dobbel bredde, streng stednavn) {this.longitude = longitude; dette.breddegrad = breddegrad; this.placeName = stednavn; } // getters og setters}

Bruke containerklasser som Koordinater gjør oss i stand til å modellere komplekse datatyper med meningsfulle navn.

Neste trinn er å sette i gang og returnere en forekomst av Koordinater:

Koordinater getCoordinates () {dobbel lengdegrad = 10; dobbel breddegrad = 12,5; String placeName = "hjem"; returner nye koordinater (lengdegrad, breddegrad, stedsnavn); }

Vi bør merke oss det Det anbefales at vi lager dataklasser som Koordinater uforanderlig. Ved å gjøre det skaper vi enkle, trådsikre, delbare gjenstander.

5. Bruke tupler

I likhet med containere lagrer tupler felt av forskjellige typer. De skiller seg imidlertid ut ved at de ikke er applikasjonsspesifikke.

De er spesialiserte når vi bruker dem til å beskrive hvilke typer vi ønsker at de skal håndtere, men er beholder for et generelt antall verdier. Dette betyr at vi ikke trenger å skrive tilpasset kode for å ha dem, og vi kan bruke et bibliotek eller lage en felles enkeltimplementering.

En tuple kan ha et hvilket som helst antall felt og kalles ofte Tuplen, hvor n er antall felt. For eksempel er Tuple2 en to-felt tuple, Tuple3 er en tre-felt tuple, og så videre.

La oss vurdere følgende eksempel for å demonstrere viktigheten av tupler. Anta at vi vil finne avstanden mellom a Koordinater punkt og alle andre punkter inne i Liste. Deretter må vi returnere det fjerneste Koordinat-objektet, sammen med avstanden.

La oss først lage en generell to-felts tuple:

offentlig klasse Tuple2 {privat K først; privat V sekund; public Tuple2 (K first, V second) {this.first = first; dette. andre = sekund; } // getters og setters}

La oss deretter implementere logikken vår og bruke en Tuple2 forekomst for å pakke inn resultatene:

Tuple2 getMostDistantPoint (List coordinatesList, Coordinates target) {return coordinatesList.stream () .map (coor -> new Tuple2 (coor, coor.calculateDistance (target))) .max ((d1, d2) -> Double.compare (d1 .getSecond (), d2.getSecond ())) // sammenlign avstander .get (); }

Ved hjelp av Tuple2 i det forrige eksemplet har reddet oss fra å lage en egen beholderklasse for engangsbruk med denne metoden.

Som containere, tupler bør være uforanderlige. I tillegg, på grunn av deres generelle formål, vi bør bruke tuples internt i stedet for som en del av vårt offentlige API.

6. Tredjepartsbiblioteker

Noen tredjepartsbiblioteker har implementert en uforanderlig Par eller Trippel type. Apache Commons Lang og javatuples er gode eksempler. Når vi har disse bibliotekene som avhengigheter i applikasjonen vår, kan vi bruke Par eller Trippel typer levert av bibliotekene i stedet for å lage dem av oss selv.

La oss se på et eksempel ved å bruke Apache Commons Lang for å returnere en Par eller a Trippel gjenstand.

Før vi går videre, la oss legge til commons-lang3 avhengighet i vår pom.xml:

 org.apache.commons commons-lang3 3.9 

6.1. Uforanderlig par fra Apache Commons Lang

De Uforanderlig par type fra Apache Commons Lang er akkurat det vi ønsker: en uforanderlig type hvis bruk er grei.

Den inneholder to felt: venstre og Ikke sant. La oss se hvordan vi kan lage våre getMostDistantPoint metoden returnere et objekt av Uforanderlig par type:

ImmutablePair getMostDistantPoint (List coordinatesList, Coordinates target) {return coordinatesList.stream () .map (coordinates -> ImmutablePair.of (coordinates, coordinates.calculateDistance (target))) .max (Comparator.comparingDouble (Pair :: getRight)). få(); }

6.2. ImmutableTriple fra Apache Commons Lang

De ImmutableTriple er ganske lik Uforanderlig par. Den eneste forskjellen er, som navnet forteller, en ImmutableTriple inneholder tre felt: venstre, midten, og Ikke sant.

La oss nå legge til en ny metode i koordinatberegningen for å vise hvordan du bruker ImmutableTriple type.

Vi skal gjennom alle punktene i a Liste for å finne ut min, gj.sn. og maks avstander til det gitte målpunktet.

La oss se hvordan vi kan returnere de tre verdiene med en enkelt metode ved hjelp av ImmutableTriple klasse:

ImmutableTriple getMinAvgMaxTriple (List coordinatesList, Coordinates target) {List distanceList = coordinatesList.stream () .map (coordinates -> coordinates.calculateDistance (target)) .collect (Collectors.toList ()); Double minDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .min (). GetAsDouble (); Double avgDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .average (). OrElse (0.0D); Dobbel maxDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .max (). GetAsDouble (); returner ImmutableTriple.of (minDistance, avgDistance, maxDistance); }

7. Konklusjon

I denne artikkelen har vi lært hvordan du bruker matriser, samlinger, containere og tupler for å returnere flere verdier fra en metode. Vi kan bruke matriser og samlinger i enkle tilfeller, siden de pakker inn en enkelt datatype.

På den annen side er containere og tupler nyttige for å skape komplekse typer, med containere som gir bedre lesbarhet.

Vi lærte også at noen tredjepartsbiblioteker har implementert par- og trippeltyper og så noen eksempler fra Apache Commons Lang-biblioteket.

Som vanlig er kildekoden for denne artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found