Premeniť pole primitívov na zoznam
1. Prehľad
V tomto krátkom návode ukážeme si, ako previesť pole primitívov na a Zoznam predmetov zodpovedajúceho typu. Typicky by sme sa mohli pokúsiť použiť autoboxing v Jave. Ako si však ukážeme v nasledujúcej časti, naša intuícia fungovania autoboxu môže byť často chybná.
2. Problém
Začnime definíciou problému. Máme množstvo primitívov (int []), a chceme konvertovať toto pole na a Zoznam (Zoznam). Intuitívnym prvým pokusom môže byť:
int [] vstup = nový int [] {1,2,3,4}; Zoznam výstupov = Arrays.asList (vstup);
Bohužiaľ toto sa nezkompiluje z dôvodu nekompatibility typu. Možno by sme čakali, že autobox bude pracovať s poľami primitívov. Táto inštinktívna viera však nie je pravdivá.
Autoboxing sa deje iba pre jeden prvok (napríklad z int do Celé číslo). Neexistuje automatická konverzia z poľa primitívnych typov na pole ich krabicových referenčných typov (napríklad z int [] do Celé číslo []).
Začnime implementovať niekoľko riešení tohto problému.
3. Iterácia
Keďže autoboxing pracuje s jednotlivými primitívnymi prvkami, jednoduchým riešením je iba iterovať nad prvkami poľa a pridať ich do súboru Zoznam jeden za druhým:
int [] vstup = nový int [] {1,2,3,4}; Zoznamový výstup = nový ArrayList (); pre (int hodnota: vstup) {output.add (hodnota); }
Problém sme vyriešili, ale riešenie je dosť podrobné. Týmto sa dostávame k ďalšej implementácii.
4. Prúdy
Od verzie Java 8 môžeme používať Prúd API. Jednoriadkové riešenie môžeme poskytnúť pomocou a Prúd:
int [] vstup = nový int [] {1,2,3,4}; Zoznamový výstup = Arrays.stream (input) .boxed (). Collect (Collectors.toList ());
Prípadne môžeme použiť IntStream:
int [] vstup = nový int [] {1,2,3,4}; Zoznamový výstup = IntStream.of (vstup) .boxed (). Collect (Collectors.toList ());
To určite vyzerá oveľa krajšie. Ďalej sa pozrieme na niekoľko externých knižníc.
5. Guava
Knižnica Guava poskytuje obal okolo tohto problému. Začnime pridaním závislosti Maven:
Balík com.google.guava guava 29.0-jre
Môžeme použiť Ints.asList (), s podobnými triedami úžitkovosti pre ostatné primitívne typy:
int [] vstup = nový int [] {1,2,3,4}; Zoznam výstupov = Ints.asList (vstup);
6. Apache Commons
Ďalšou knižnicou je Apache Commons Lang. Opäť pridajme závislosť Maven pre túto knižnicu:
org.apache.commons commons-lang3 3.10
Presnejšie, používame ArrayUtils trieda:
int [] vstup = nový int [] {1,2,3,4}; Celé číslo [] outputBoxed = ArrayUtils.toObject (vstup); Zoznam výstupov = Arrays.asList (outputBoxed);
7. Záver
Teraz máme v našej súprave nástrojov niekoľko možností, ako previesť rad primitívnych nástrojov na a Zoznam. Ako sme videli, autobox sa deje iba pre jednotlivé prvky. V tomto tutoriáli sme videli niekoľko riešení na použitie konverzie.
Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.