Ako vrátiť viac hodnôt z metódy Java

1. Prehľad

V tomto výučbe sa naučíme rôzne spôsoby vrátenia viacerých hodnôt z metódy Java.

Najskôr vrátime polia a zbierky. Potom si ukážeme, ako používať triedy kontajnerov na komplexné údaje, a naučíme sa, ako vytvárať všeobecné triedy n-tice.

Na záver uvidíme príklady toho, ako používať knižnice tretích strán na vrátenie viacerých hodnôt.

2. Používanie polí

Polia sa dajú použiť na návrat primitívnych aj referenčných dátových typov.

Napríklad nasledujúce getCoordinates metóda vráti pole dvoch dvojitý hodnoty:

double [] getCoordinatesDoubleArray () {double [] súradnice = nový double [2]; súradnice [0] = 10; súradnice [1] = 12,5; spätné súradnice; }

Ak chceme vrátiť pole rôznych referenčných typov, môžeme ako typ poľa použiť bežný nadradený typ:

Číslo [] getCoordinatesNumberArray () {číslo [] súradnice = nové číslo [2]; súradnice [0] = 10; // Celé súradnice [1] = 12,5; // Dvojité návratové súradnice; }

Tu sme definovali súradnice pole typu Číslo pretože je to bežná trieda medzi Celé číslo a Dvojitý prvkov.

3. Používanie zbierok

Vďaka všeobecným zbierkam Java môžeme vrátiť viac hodnôt spoločného typu.

Rámec zbierok má široké spektrum tried a rozhraní. V tejto časti však našu diskusiu obmedzíme na Zoznam a Mapa rozhrania.

3.1. Vrátenie hodnôt podobného typu do zoznamu

Na začiatok prepíšeme predchádzajúci príklad poľa pomocou Zoznam:

List getCoordinatesList () {List Coordinates = new ArrayList (); Coordinates.add (10); // Celé súradnice.add (12.5); // Dvojité návratové súradnice; }

Páči sa mi to Číslo [], Zoznam kolekcia obsahuje postupnosť prvkov zmiešaného typu rovnakého spoločného typu.

3.2. Vrátenie pomenovaných hodnôt na mapu

Ak by sme chceli pomenovať každý záznam v našej zbierke, a Mapa možno použiť namiesto toho:

Mapa getCoordinatesMap () {Súradnice mapy = nový HashMap (); Coordinates.put ("zemepisná dĺžka", 10); Coordinates.put ("zemepisná šírka", 12,5); spätné súradnice; }

Používatelia getCoordinatesMap metóda môže použiť „zemepisná dĺžka “ alebo „zemepisná šírka “ kľúče s Mapa # dostať metóda na získanie zodpovedajúcej hodnoty.

4. Používanie tried kontajnerov

Na rozdiel od polí a zbierok kontajnerové triedy (POJO) môžu zabaliť viac polí s rôznymi dátovými typmi.

Napríklad nasledujúce Súradnice trieda má dva rôzne typy údajov, dvojitý a String:

public class Coordinates {private double longitude; dvojitá súkromná šírka; private String placeName; verejné súradnice (dvojitá zemepisná dĺžka, dvojitá zemepisná šírka, reťazec placeName) {this.longitude = longitude; this.latitude = latitude; this.placeName = placeName; } // zakladatelia a zakladatelia}

Používanie tried kontajnerov ako Súradnice nám umožňuje modelovať zložité dátové typy so zmysluplnými názvami.

Ďalším krokom je vytvorenie inštancie a vrátenie inštancie Súradnice:

Súradnice getCoordinates () {double longitude = 10; dvojitá šírka = 12,5; Reťazec placeName = "domov"; vrátiť nové súradnice (zemepisná dĺžka, šírka, miestoMeno); }

Mali by sme si to všimnúť odporúča sa, aby sme vytvorili dátové triedy ako Súradnice nemenný. Týmto spôsobom vytvárame jednoduché objekty zdieľateľné s bezpečnosťou voči vláknam.

5. Používanie Tuples

Rovnako ako kontajnery, n-tice ukladajú polia rôznych typov. Líšia sa však tým, že sa netýkajú konkrétnych aplikácií.

Špecializujú sa na ne, keď pomocou nich popisujeme, s ktorými typmi chceme manipulovať, ale sú kontajnerom na všeobecné účely s určitým počtom hodnôt. To znamená, že na to, aby sme ich mali, nemusíme písať vlastný kód a môžeme použiť knižnicu alebo vytvoriť spoločnú jednotnú implementáciu.

N-tica môže mať ľubovoľný počet polí a často sa nazýva Násobnýn, kde n je počet polí. Napríklad Tuple2 je n-tica s dvoma poľami, Tuple3 je n-tica s tromi poľami atď.

Aby sme demonštrovali dôležitosť n-tic, zvážme nasledujúci príklad. Predpokladajme, že chceme nájsť vzdialenosť medzi a Súradnice bod a všetky ostatné body vo vnútri a Zoznam. Potom musíme vrátiť ten najvzdialenejší objekt Súradnice spolu so vzdialenosťou.

Najprv vytvoríme všeobecnú n-ticu s dvoma poľami:

verejná trieda Tuple2 {najskôr súkromná K; súkromné ​​V druhé; public Tuple2 (K prvý, V druhý) {this.first = prvý; this.second = second; } // zakladatelia a zakladatelia}

Ďalej implementujme našu logiku a použite a Tuple2 napríklad na zabalenie výsledkov:

Tuple2 getMostDistantPoint (zoznam súradníc, cieľ súradníc) {návratové súradniceList.stream () .map (coor -> nový Tuple2 (coor, coor.calculateDistance (target))) .max ((d1, d2) -> Double.compare (d1 .getSecond (), d2.getSecond ())) // porovnanie vzdialeností .get (); }

Použitím Tuple2 v predchádzajúcom príklade nás zachránil pred vytvorením samostatnej triedy kontajnerov na jednorazové použitie s touto konkrétnou metódou.

Ako kontajnery, n-tice by mali byť nemenné. Kvôli svojej univerzálnej povahe navyše n-tice by sme mali používať skôr interne, než ako súčasť nášho verejného API.

6. Knižnice tretích strán

Niektoré knižnice tretích strán implementovali nemenné Pár alebo Triple typu. Príkladmi sú Apache Commons Lang a javatuples. Keď už máme tieto knižnice ako závislosti v našej aplikácii, môžeme priamo používať Pár alebo Triple typy poskytované knižnicami namiesto toho, aby sme ich vytvorili sami.

Pozrime sa na príklad použitia Apache Commons Lang na vrátenie a Pár alebo a Triple objekt.

Predtým, ako vykročíme ďalej, pridajme commons-lang3 závislosť v našom pom.xml:

 org.apache.commons commons-lang3 3.9 

6.1. ImmutablePair od Apache Commons Lang

The ImmutablePair typ od Apache Commons Lang je presne to, čo chceme: nemenný typ, ktorého použitie je priame.

Obsahuje dve polia: vľavo a správny. Pozrime sa, ako vyrobiť náš getMostDistantPoint metóda vráti objekt z ImmutablePair typ:

ImmutablePair getMostDistantPoint (zoznam súradníc, cieľ súradníc) {návratové súradniceList.stream () .map (súradnice -> ImmutablePair.of (súradnice, súradnice.calculateDistance (cieľ))) .max (Comparator.comparingDouble (Pair :: getRight)). get (); }

6.2. ImmutableTriple od Apache Commons Lang

The ImmutableTriple je dosť podobný ImmutablePair. Jediný rozdiel je, ako hovorí jeho názov, an ImmutableTriple obsahuje tri polia: vľavo, stred, a správny.

Teraz pridajme do výpočtu súradníc novú metódu, ktorá nám ukáže, ako používať ImmutableTriple typu.

Prejdeme všetky body v a Zoznam zistiť min, priem., a max vzdialenosti k danému cieľovému bodu.

Pozrime sa, ako môžeme vrátiť tieto tri hodnoty pomocou jedinej metódy pomocou znaku ImmutableTriple trieda:

ImmutableTriple getMinAvgMaxTriple (Zoznam súradníc, Cieľ súradníc) {Zoznam vzdialenosťList = súradniceList.stream () .map (súradnice -> súradnice.calculateDistance (cieľ)) .collect (Collectors.toList ()); Double minDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .min (). GetAsDouble (); Double avgDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .average (). OrElse (0,0D); Double maxDistance = distanceList.stream (). MapToDouble (Double :: doubleValue) .max (). GetAsDouble (); return ImmutableTriple.of (minDistance, avgDistance, maxDistance); }

7. Záver

V tomto článku sme sa naučili, ako používať polia, kolekcie, kontajnery a n-tice na vrátenie viacerých hodnôt z metódy. Polia a kolekcie môžeme použiť v jednoduchých prípadoch, pretože obsahujú jediný dátový typ.

Na druhej strane sú kontajnery a n-tice užitočné pri vytváraní zložitých typov, pričom kontajnery ponúkajú lepšiu čitateľnosť.

Dozvedeli sme sa tiež, že niektoré knižnice tretích strán implementovali dvojité a trojité typy, a videli sme niekoľko príkladov z knižnice Apache Commons Lang.

Ako obvykle je zdrojový kód tohto článku k dispozícii na GitHub.


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