Hogyan adhatunk vissza több értéket egy Java módszerből

1. Áttekintés

Ebben az oktatóanyagban megtanulhatjuk, hogyan lehet több értéket visszaadni egy Java módszerből.

Először visszaadjuk a tömböket és a gyűjteményeket. Ezután megmutatjuk, hogyan lehet a tárolóosztályokat használni összetett adatokhoz, és megtanuljuk, hogyan hozhatunk létre általános kettős osztályokat.

Végül látni fogunk példákat arra, hogyan használhat harmadik fél könyvtárai több érték visszaadásához.

2. A tömbök használata

A tömbök felhasználhatók mind a primitív, mind a referencia adattípusok visszaadására.

Például a következők getCoordinates metódus két tömböt ad vissza kettős értékek:

dupla [] getCoordinatesDoubleArray () {dupla [] koordináta = új dupla [2]; koordináták [0] = 10; koordináták [1] = 12,5; visszatérési koordináták; }

Ha különböző referenciatípusú tömböt akarunk visszaadni, akkor a tömb típusaként használhatunk egy közös szülőtípust:

Szám [] getCoordinatesNumberArray () {Szám [] koordináta = új Szám [2]; koordináták [0] = 10; // Egész koordináták [1] = 12,5; // Dupla visszatérési koordináták; }

Itt definiáltuk a koordináták típusú tömb Szám mert ez a közös osztály a között Egész szám és Kettős elemek.

3. Gyűjtemények használata

Általános Java gyűjteményekkel, több közös típusú értéket adhatunk vissza.

A gyűjteményes keretrendszer az osztályok és interfészek széles spektrumával rendelkezik. Ebben a szakaszban azonban csak a Lista és Térkép interfészek.

3.1. Hasonló típusú értékek visszatérése egy listában

Először is írjuk át az előző tömböt a használatával Lista:

List getCoordinatesList () {List koordináták = new ArrayList (); koordináták.add (10); // Egész koordináták.add (12.5); // Dupla visszatérési koordináták; }

Mint Szám[], a Lista a gyűjtemény vegyes típusú elemeket tartalmaz, amelyek mindegyike azonos típusú.

3.2. Megnevezett értékek visszaadása egy térképen

Ha meg szeretnénk nevezni gyűjteményünk minden bejegyzését, a Térkép használható helyette:

GetCoordinatesMap () {Térkép koordinátái = új HashMap (); coordinates.put ("hosszúság", 10); coordinates.put ("szélesség", 12.5); visszatérési koordináták; }

A getCoordinatesMap módszer a „hosszúság" vagy „szélességi kör" gombokat a Térkép # get módszer a megfelelő érték lekéréséhez.

4. Konténerosztályok használata

A tömböktől és gyűjteményektől eltérően tárolóosztályok (POJO-k) több mezőt is be tudnak burkolni különböző adattípusokkal.

Például a következők Koordináták osztálynak két különböző adattípusa van, kettős és Húr:

nyilvános osztály Koordináták {privát kettős hosszúság; saját kettős szélesség; privát String helyNév; nyilvános koordináták (kettős hosszúság, kettős szélesség, String helynév) {this.longitude = longitude; ez.latitude = szélesség; this.helyNév = helyNév; } // szerelők és beállítók}

A (z) tárolóosztályok használata Koordináták lehetővé teszi számunkra, hogy értelmes nevű komplex adattípusokat modellezzünk.

A következő lépés a példány példányosítása és visszaadása Koordináták:

Koordináták getCoordinates () {kettős hosszúság = 10; kettős szélesség = 12,5; Karakterlánc helyNév = "home"; adja vissza az új koordinátákat (hosszúság, szélesség, helyNév); }

Meg kell jegyeznünk ajánlott olyan adatosztályokat készíteni, mint Koordináták változhatatlan. Ezzel egyszerű, szálbiztos, megosztható tárgyakat hozunk létre.

5. A Tuples használata

A konténerekhez hasonlóan a csomagok különböző típusú mezőket tárolnak. Azonban abban különböznek egymástól, hogy nem alkalmazásspecifikusak.

Speciálisak, amikor arra használjuk őket, hogy leírjuk, mely típusokat akarjuk kezelni, de általános célú konténerek bizonyos számú értékhez. Ez azt jelenti, hogy nem kell egyedi kódot írni, hogy rendelkezzünk velük, és használhatunk egy könyvtárat, vagy létrehozhatunk egy közös megvalósítást.

A kettő tetszőleges számú mező lehet, és gyakran hívják Tuplen, ahol n a mezők száma. Például a Tuple2 kétmezős, a Tuple3 hárommezős, és így tovább.

A többszörös fontosságának bemutatásához vegyük figyelembe a következő példát. Tegyük fel, hogy meg akarjuk találni a távolságot a Koordináták pont és az összes többi pont a Lista. Ezután vissza kell adnunk azt a legtávolabbi Koordináta objektumot, a távolsággal együtt.

Először hozzunk létre egy általános kétmezős duplát:

nyilvános osztály Tuple2 {privát K előbb; magán V második; nyilvános Tuple2 (K első, V második) {ez.első = első; ez.második = második; } // szerelők és beállítók}

Ezután hajtsuk végre a logikánkat, és használjuk a Tuple2 példány az eredmények bepakolásához:

Tuple2 getMostDistantPoint (List coordinatesList, Coordinates target) {return coordinatesList.stream () .map (coor -> új Tuple2 (coor, coor.calculateDistance (target))) .max ((d1, d2) -> Double.compare (d1 .getSecond (), d2.getSecond ())) // összehasonlítja a távolságokat .get (); }

Használata Tuple2 az előző példa mentett meg minket attól, hogy külön tároló osztályt hozzunk létre egyszeri használatra ezzel a módszerrel.

Mint a konténerek, a pároknak változhatatlannak kell lenniük. Ezenkívül általános célú jellegük miatt belsőleg kell használnunk a sorrendet, nem pedig a nyilvános API részeként.

6. Harmadik fél könyvtárai

Néhány harmadik féltől származó könyvtár megváltoztathatatlanul működött Pár vagy Hármas típus. Az Apache Commons Lang és a javatuples példák. Amint ezek a könyvtárak függőségként szerepelnek az alkalmazásunkban, közvetlenül használhatjuk a Pár vagy Hármas a könyvtárak által biztosított típusok, ahelyett, hogy saját magunk hoznánk létre őket.

Nézzünk meg egy példát az Apache Commons Lang használatával a Pár vagy a Hármas tárgy.

Mielőtt tovább lépünk, tegyük hozzá a commons-lang3 függőség a mi pom.xml:

 org.apache.commons commons-lang3 3.9 

6.1. ImmutablePair az Apache Commons Lang-tól

A ImmutablePair az Apache Commons Lang típusa pontosan az, amire vágyunk: egy változhatatlan típus, amelynek használata egyszerű.

Két mezőt tartalmaz: bal és jobb. Nézzük meg, hogyan lehet a mi getMostDistantPoint metódus visszaadja a ImmutablePair típus:

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

6.2. ImmutableTriple az Apache Commons Lang-tól

A ImmutableTriple elég hasonló a ImmutablePair. Az egyetlen különbség, amint a neve is mondja, egy ImmutableTriple három mezőt tartalmaz: bal, középső, és jobb.

Most adjunk hozzá egy új módszert a koordináták számításához, hogy bemutassuk a ImmutableTriple típus.

Az a pont minden pontját át fogjuk nézni Lista hogy megtudja a min, átlag, és max távolságok az adott célponttól.

Nézzük meg, hogyan adhatjuk vissza a három értéket egyetlen módszerrel a ImmutableTriple osztály:

ImmutableTriple getMinAvgMaxTriple (List coordinatesList, Coordinates target) {List distanceList = coordinatesList.stream () .map (koordináták -> koordináták.calculateDistance (cél)) .collect (Collectors.toList ()); Dupla minDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .min (). GetAsDouble (); Dupla avgDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .átlag (). VagyElse (0.0D); Dupla maxDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .max (). GetAsDouble (); return ImmutableTriple.of (minDistance, avgDistance, maxDistance); }

7. Következtetés

Ebben a cikkben megtanultuk, hogyan lehet tömböket, gyűjteményeket, tárolókat és tömböket használni, hogy egy módszerből több értéket adjanak vissza. Tömböket és gyűjteményeket egyszerű esetekben használhatunk, mivel egyetlen adattípust csomagolnak.

Másrészt a konténerek és a csomagok hasznosak komplex típusok létrehozásában, amelyek jobb olvashatóságot kínálnak.

Megtudtuk azt is, hogy néhány harmadik féltől származó könyvtár pár- és hármas típusokat valósított meg, és láttunk néhány példát az Apache Commons Lang könyvtárból.

Szokás szerint a cikk forráskódja elérhető a GitHubon.