Kako vratiti više vrijednosti iz Java metode

1. Pregled

U ovom uputstvu naučit ćemo različite načine vraćanja višestrukih vrijednosti iz Java metode.

Prvo ćemo vratiti nizove i zbirke. Zatim ćemo pokazati kako koristiti klase spremnika za složene podatke i naučiti kako stvoriti generičke klase tuple.

Na kraju ćemo vidjeti primjere kako koristiti biblioteke trećih strana za vraćanje više vrijednosti.

2. Korištenje nizova

Nizovi se mogu koristiti za vraćanje primitivnih i referentnih tipova podataka.

Na primjer, sljedeće getCoordinate metoda vraća niz od dva dvostruko vrijednosti:

double [] getCoordinatesDoubleArray () {double [] koordinate = novi double [2]; koordinate [0] = 10; koordinate [1] = 12,5; povratne koordinate; }

Ako želimo vratiti niz različitih tipova referenci, možemo koristiti uobičajeni roditeljski tip kao tip niza:

Number [] getCoordinatesNumberArray () {Broj [] koordinate = novi broj [2]; koordinate [0] = 10; // Cjelobrojne koordinate [1] = 12,5; // Dvostruke povratne koordinate; }

Ovdje smo definirali koordinate niz vrsta Broj jer je to uobičajena klasa između Cijeli broj i Dvostruko elementi.

3. Korištenje zbirki

Uz generičke Java kolekcije, možemo vratiti više vrijednosti zajedničkog tipa.

Okvir zbirki ima širok spektar klasa i sučelja. Međutim, u ovom ćemo dijelu našu raspravu ograničiti na Popis i Karta sučelja.

3.1. Vraćanje vrijednosti sličnog tipa na popisu

Za početak prepišimo prethodni primjer niza pomoću Popis:

Popis getCoordinatesList () {Koordinate popisa = novi ArrayList (); koordinate.add (10); // Integer koordinate.add (12.5); // Dvostruke povratne koordinate; }

Kao Broj[], Popis Zbirka sadrži slijed miješanih elemenata koji su svi istog uobičajenog tipa.

3.2. Vraćanje imenovanih vrijednosti na karti

Ako želimo imenovati svaki unos u našoj zbirci, a Karta može se koristiti umjesto toga:

Karta getCoordinatesMap () {Koordinate mape = novi HashMap (); координати.put ("zemljopisna dužina", 10); koordinate.put ("zemljopisna širina", 12,5); povratne koordinate; }

Korisnici getCoordinatesMap metoda može koristiti "zemljopisna dužina " ili "zemljopisna širina " tipke s tipkom Map # get metoda za dohvaćanje odgovarajuće vrijednosti.

4. Korištenje klasa kontejnera

Za razliku od nizova i zbirki, klase spremnika (POJO) mogu omotati više polja s različitim vrstama podataka.

Na primjer, sljedeće Koordinate razred ima dvije različite vrste podataka, dvostruko i Niz:

koordinate javne klase {privatna dvostruka dužina; privatna dvostruka širina; private String placeName; javne koordinate (dvostruka dužina, dvostruka geografska širina, niz mjestaName) {this.longitude = longitude; this.latitude = zemljopisna širina; this.placeName = imeName; } // geteri i postavljači}

Korištenje klasa spremnika poput Koordinate omogućuje nam modeliranje složenih tipova podataka sa smislenim imenima.

Sljedeći je korak instanciranje i vraćanje instance Koordinate:

Koordinate getCoordinates () {dvostruka dužina = 10; dvostruka širina = 12,5; String placeName = "home"; vratiti nove koordinate (dužina, širina, imeName); }

To bismo trebali primijetiti preporučuje se da napravimo klase podataka poput Koordinate nepromjenjiv. Na taj način stvaramo jednostavne objekte koji se mogu dijeliti bez ikakvih niti.

5. Korištenje korijena

Poput spremnika, i tupleti pohranjuju polja različitih vrsta. Međutim, razlikuju se po tome što nisu specifični za primjenu.

Specijalizirani su kada ih koristimo za opisivanje tipova s ​​kojima želimo raditi, ali su spremnik opće namjene određenog broja vrijednosti. To znači da ne trebamo pisati prilagođeni kôd da bismo ih imali, a možemo koristiti knjižnicu ili stvoriti zajedničku pojedinačnu implementaciju.

Korpa može biti bilo kojeg broja polja i često se naziva Korijenn, gdje je n broj polja. Primjerice, Tuple2 je dvostruko polje, Tuple3 je tropolje i tako dalje.

Da bismo demonstrirali važnost korijena, razmotrimo sljedeći primjer. Pretpostavimo da želimo pronaći udaljenost između a Koordinate točka i sve ostale točke unutar a Popis. Zatim, moramo vratiti taj najudaljeniji Koordinatni objekt, zajedno s udaljenostom.

Stvorimo prvo generički nabor od dva polja:

javna klasa Tuple2 {prvo privatno K; privatni V drugi; javni Tuple2 (K prvi, V drugi) {this.first = prvi; this.second = second; } // geteri i postavljači}

Dalje, provedimo našu logiku i upotrijebimo a Korijen2 instanca za umotavanje rezultata:

Tuple2 getMostDistantPoint (Popis koordinataList, Koordinate cilja) {povratak koordinataList.stream () .map (coor -> novi Tuple2 (coor, coor.calculateDistance (target))) .max ((d1, d2) -> Double.com (d1 .getSecond (), d2.getSecond ())) // uspoređivanje udaljenosti .get (); }

Koristeći Korijen2 u prethodnom primjeru spasio nas je od stvaranja zasebne klase spremnika za jednokratnu upotrebu ovom određenom metodom.

Poput kontejnera, korijeni bi trebali biti nepromjenjivi. Uz to, zbog svoje opće namjene, korijene bismo trebali koristiti interno, a ne kao dio našeg javnog API-ja.

6. Knjižnice trećih strana

Neke su neovisne knjižnice implementirale nepromjenjive Par ili Utrostručiti tip. Apache Commons Lang i javatuples glavni su primjeri. Jednom kada imamo te knjižnice kao ovisnosti u našoj aplikaciji, možemo izravno koristiti Par ili Utrostručiti vrste koje pružaju knjižnice umjesto da ih stvaramo sami.

Pogledajmo primjer korištenja Apache Commons Lang za vraćanje a Par ili a Utrostručiti objekt.

Prije nego što zakoračimo dalje, dodajmo znak commons-lang3 ovisnost u našem pom.xml:

 org.apache.commons commons-lang3 3.9 

6.1. Nepromjenjivi par od Apache Commons Lang

The Nepromjenjivi par type iz Apache Commons Lang je upravo ono što želimo: nepromjenjivi tip čija je upotreba jednostavna.

Sadrži dva polja: lijevo i pravo. Pogledajmo kako napraviti naš getMostDistantPoint metoda vraća objekt datoteke Nepromjenjivi par tip:

ImmutablePair getMostDistantPoint (Popis koordinataList, Koordinate cilja) {povratak koordinataList.stream () .map (koordinate -> ImmutablePair.of (koordinate, koordinate.calculateDistance (cilj))) .max (Comparator.comparingDouble (Pair :: getRight)). dobiti(); }

6.2. NepromjenjiviTrostruki od Apache Commons Lang

The NepromjenjiviTrostruki je prilično sličan Nepromjenjivi par. Jedina razlika je, kako mu samo ime govori, an NepromjenjiviTrostruki sadrži tri polja: lijevo, sredina, i pravo.

Sad, dodajmo novu metodu u izračun koordinata kako bismo pokazali kako se koristi NepromjenjiviTrostruki tip.

Proći ćemo kroz sve točke u a Popis kako bi saznali min, prosj, i maks udaljenosti do zadane ciljne točke.

Pogledajmo kako možemo vratiti tri vrijednosti jednom metodom pomoću NepromjenjiviTrostruki razred:

ImmutableTriple getMinAvgMaxTriple (Popis koordinataPopis, Koordinate cilja) {Popis distanceList = koordinateList.stream () .map (koordinate -> koordinate.kalkulirajDistanca (cilj)) .collect (Collectors.toList ()); Double minDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .min (). GetAsDouble (); Double avgDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .average (). OrElse (0.0D); Dvostruko maxDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .max (). GetAsDouble (); return ImmutableTriple.of (minDistance, avgDistance, maxDistance); }

7. Zaključak

U ovom smo članku naučili kako koristiti nizove, zbirke, spremnike i korice za vraćanje višestrukih vrijednosti iz metode. Nizove i zbirke možemo koristiti u jednostavnim slučajevima, jer oni omotavaju jedan tip podataka.

S druge strane, spremnici i korice korisni su u stvaranju složenih vrsta, s spremnicima koji nude bolju čitljivost.

Također smo saznali da su neke neovisne knjižnice implementirale par i trostruki tip i vidjeli smo neke primjere iz biblioteke Apache Commons Lang.

Kao i obično, izvorni kod za ovaj članak dostupan je na GitHubu.