Sådan returneres flere værdier fra en Java-metode

1. Oversigt

I denne vejledning lærer vi forskellige måder at returnere flere værdier fra en Java-metode.

Først returnerer vi arrays og samlinger. Derefter viser vi, hvordan man bruger containerklasser til komplekse data og lærer, hvordan man opretter generiske tupleklasser.

Endelig vil vi se eksempler på, hvordan man bruger tredjepartsbiblioteker til at returnere flere værdier.

2. Brug af arrays

Arrays kan bruges til at returnere både primitive og reference datatyper.

For eksempel følgende getCoordinates metode returnerer en matrix på to dobbelt værdier:

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

Hvis vi vil returnere en matrix med forskellige referencetyper, kan vi bruge en fælles overordnet type som arrayets type:

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

Her har vi defineret koordinater række af type Nummer fordi det er den fælles klasse imellem Heltal og Dobbelt elementer.

3. Brug af samlinger

Med generiske Java-samlinger vi kan returnere flere værdier af en fælles type.

Samlingsrammen har et bredt spektrum af klasser og grænseflader. I dette afsnit begrænser vi dog vores diskussion til Liste og Kort grænseflader.

3.1. Returnerende værdier af lignende type på en liste

Lad os starte med at omskrive det foregående matrixeksempel ved hjælp af Liste:

Liste getCoordinatesList () {List koordinater = ny ArrayList (); koordinater. tilføj (10); // Heltals koordinater.add (12.5); // Dobbeltreturkoordinater; }

Synes godt om Nummer[], det Liste samling indeholder en sekvens af blandede elementelementer, der alle er af samme almindelige type.

3.2. Returnering af navngivne værdier på et kort

Hvis vi gerne vil navngive hver post i vores samling, a Kort kan bruges i stedet:

Map getCoordinatesMap () {Map coordinates = new HashMap (); coordinates.put ("længdegrad", 10); coordinates.put ("latitude", 12.5); returnere koordinater }

Brugere af getCoordinatesMap metode kan bruge “længde" eller “Breddegrad" tasterne med Kort # få metode til at hente den tilsvarende værdi.

4. Brug af containerklasser

I modsætning til arrays og samlinger containerklasser (POJO'er) kan pakke flere felter med forskellige datatyper.

For eksempel følgende Koordinater klasse har to forskellige datatyper, dobbelt og Snor:

offentlig klasse Koordinater {privat dobbelt længdegrad; privat dobbelt bredde; privat streng stednavn; offentlige koordinater (dobbelt længdegrad, dobbelt bredde, streng stednavn) {this.longitude = længdegrad; denne.breddegrad = breddegrad; this.placeName = stednavn; } // getters og setters}

Brug af containerklasser som Koordinater giver os mulighed for at modellere komplekse datatyper med meningsfulde navne.

Det næste trin er at instantiere og returnere en forekomst af Koordinater:

Koordinater getCoordinates () {dobbelt længdegrad = 10; dobbelt bredde = 12,5; String placeName = "hjem"; returner nye koordinater (længdegrad, breddegrad, stednavn); }

Det skal vi bemærke Det anbefales, at vi laver dataklasser som Koordinater uforanderlig. Ved at gøre dette skaber vi enkle, trådsikre, delbare objekter.

5. Brug af tupler

Ligesom containere gemmer tupler felter af forskellige typer. De adskiller sig imidlertid ved, at de ikke er applikationsspecifikke.

De er specialiserede, når vi bruger dem til at beskrive, hvilke typer vi vil have dem til at håndtere, men er beholder til generelle formål med et bestemt antal værdier. Dette betyder, at vi ikke behøver at skrive tilpasset kode for at have dem, og vi kan bruge et bibliotek eller oprette en fælles enkelt implementering.

En tuple kan være af et hvilket som helst antal felter og kaldes ofte Tuplen, hvor n er antallet af felter. For eksempel er Tuple2 en to-felts tuple, Tuple3 er en tre-felts tuple osv.

Lad os overveje følgende eksempel for at demonstrere vigtigheden af ​​tupler. Antag, at vi vil finde afstanden mellem a Koordinater punkt og alle andre punkter inde i Liste. Derefter er vi nødt til at returnere det fjerneste Koordinat-objekt sammen med afstanden.

Lad os først oprette en generisk to-felts tuple:

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

Lad os derefter implementere vores logik og bruge en Tuple2 eksempel for at indpakke resultaterne:

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 afstande .get (); }

Ved brug af Tuple2 i det foregående eksempel har vi reddet os fra at oprette en separat beholderklasse til engangsbrug med denne særlige metode.

Ligesom containere, tupler skal være uforanderlige. Derudover på grund af deres generelle formål er vi skal bruge tupler internt snarere end som en del af vores offentlige API.

6. Tredjepartsbiblioteker

Nogle tredjepartsbiblioteker har implementeret en uforanderlig Par eller Tredobbelt type. Apache Commons Lang og javatuples er førende eksempler. Når vi har disse biblioteker som afhængigheder i vores applikation, kan vi direkte bruge Par eller Tredobbelt typer leveret af bibliotekerne i stedet for at oprette dem af os selv.

Lad os se på et eksempel ved hjælp af Apache Commons Lang til at returnere en Par eller a Tredobbelt objekt.

Før vi går videre, lad os tilføje commons-lang3 afhængighed i vores pom.xml:

 org.apache.commons commons-lang3 3.9 

6.1. Uforanderligt par fra Apache Commons Lang

Det Uforanderligt par type fra Apache Commons Lang er nøjagtigt det, vi ønsker: en uforanderlig type, hvis brug er ligetil.

Den indeholder to felter: venstre og ret. Lad os se, hvordan vi laver vores getMostDistantPoint metode returnere et objekt fra Uforanderligt 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. UforanderligTriple fra Apache Commons Lang

Det UforanderligTriple ligner temmelig Uforanderligt par. Den eneste forskel er, som navnet antyder, en UforanderligTriple indeholder tre felter: venstre, midt, og ret.

Lad os nu tilføje en ny metode til vores koordinatberegning for at vise, hvordan du bruger UforanderligTriple type.

Vi vil gennemgå alle punkter i a Liste for at finde ud af min, gns. og maks afstande til det givne målpunkt.

Lad os se, hvordan vi kan returnere de tre værdier med en enkelt metode ved hjælp af UforanderligTriple klasse:

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

7. Konklusion

I denne artikel har vi lært, hvordan man bruger arrays, samlinger, containere og tuples til at returnere flere værdier fra en metode. Vi kan bruge arrays og samlinger i enkle tilfælde, da de indpakker en enkelt datatype.

På den anden side er containere og tupler nyttige til at skabe komplekse typer, hvor containere giver bedre læsbarhed.

Vi lærte også, at nogle tredjepartsbiblioteker har implementeret par og tredobbelt typer og så nogle eksempler fra Apache Commons Lang-biblioteket.

Som normalt er kildekoden til denne artikel tilgængelig på GitHub.


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