Kako elegantno isprintati Java niz?
„Brate, ranije sam od tebe čula da je i niz objekat, ali u Javi takva klasa nije eksplicitno definisana.“ Izgleda da Sanmej pažljivo uči.
„Tačno je, zato nizovi nemaju priliku da prevaziđu metod Object.toString(). Ako pokušate da direktno isprintate niz, rezultat koji dobijete nije ono što očekujete.“ nastavio sam na njene reči.
„Pa kako onda isprintati niz?“ Sanmej je instinktivno postavila ključno pitanje današnjeg časa.
Zašto ne možemo direktno isprintati niz
„Prvo, hajde da pogledamo zašto ne možemo direktno isprintati niz i koji problem nastaje kada to pokušamo.“
Pogledajmo sledeći primer.
String [] cmowers = {"Chenmo","Wang Er","zanimljiv programer"};
System.out.println(cmowers);Rezultat koji program ispisuje je:
[Ljava.lang.String;@3d075dc0[Ljava.lang.String; predstavlja ime klase niza stringova, a nakon @ je heksadekadni hash kod — takav rezultat ispisa je previše „nepregledan“ i prosečna osoba ga ne razume! Zašto se prikazuje ovako? Pogledajte metod toString() klase java.lang.Object i biće vam jasno.
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}Ovo ponovo dokazuje da, iako niz nije eksplicitno definisan kao klasa, on jeste objekat koji nasleđuje sve metode svog pretka Object.
„Brate, pa zašto se za nizove posebno ne definiše jedna klasa da ih predstavi, kao što je to slučaj sa klasom String?“ Ovo pitanje od Sanmej budi glavobolju, ali se lako objašnjava.
„Jedno razumno objašnjenje je da ga Java krije. Pretpostavimo da takva klasa zaista postoji, nazovimo je Array.java, i zamislimo kako bi zaista izgledala — morala bi imati neki kontejner za čuvanje svakog elementa niza, baš kao klasa String.“ Dok sam odgovarao Sanmej, istovremeno sam otvorio izvorni kod klase String.
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}„Na kraju, i dalje je potreban neki oblik niza za čuvanje elemenata niza, zar ne? To postaje prilično nepotrebno, pa hajde da nizove jednostavno shvatimo kao objekte bez fizičkog oblika!“
„Dobro, nećemo više o tome.“ Bojao sam se da će tema otići predaleko — do granice da ni sam ne mogu da odgovorim, što bi bilo nelagodno — pa sam brzo vratio Sanmej pažnju na pravi put.
Ispis Java niza pomoću Stream toka
„Pogledajmo prvi način ispisa niza, korišćenjem malo modernijeg Stream toka.“
Prvi oblik:
Arrays.asList(cmowers).stream().forEach(s -> System.out.println(s));Drugi oblik:
Stream.of(cmowers).forEach(System.out::println);Treći oblik:
Arrays.stream(cmowers).forEach(System.out::println);Rezultat ispisa je prikazan ispod.
Chenmo
Wang Er
zanimljiv programerTačno, ova tri načina lako mogu obaviti posao, a pritom deluju prilično napredno, jer koriste Stream i lambda izraze.
Ispis Java niza pomoću for petlje
„Naravno, možete koristiti i tradicionalan način — for petlju. Čak i for-each radi.“
for(int i = 0; i < cmowers.length; i++){
System.out.println(cmowers[i]);
}
for (String s : cmowers) {
System.out.println(s);
}Ispis Java niza pomoću Arrays klase alata
„Brate, zar si zaboravio da smo u prethodnom članku, kada smo govorili o klasi alata Arrays, pomenuli još jedan metod Arrays.toString()?“ Sanmej je malo požurila, pošto nikako da pređem na stvar.
„Naravno da nisam, smatram da je Arrays.toString() najbolji način za ispis niza, bez konkurencije.“ malo sam se uzbudio.
Arrays.toString() može pretvoriti niz bilo kog tipa u string, uključujući nizove primitivnih tipova i nizove referentnih tipova. Ovaj metod ima više preopterećenih oblika.

Korišćenje metoda Arrays.toString() za ispis niza ne može biti elegantnije — poput, poput, poput osmeha Mona Lize.

(Sanmej nije mogla a da se ne nasmeje kada je videla ovu sliku)
„Sanmej, nemoj da se smeje, hajde, u prijatnom raspoloženju pogledaj primer koda.“
String [] cmowers = {"Chenmo","Wang Er","zanimljiv programer"};
System.out.println(Arrays.toString(cmowers));Rezultat ispisa programa:
[Chenmo, Wang Er, zanimljiv programer]Vau, format ispisa ne može biti savršeniji — ni više ni manje! Potpuno ono što smo očekivali: [] ukazuje da je u pitanju niz, dok zarez i razmak služe za razdvajanje elemenata.
Ispis dvodimenzionalnog niza pomoću Arrays klase alata
„Brate, šta ako želim da ispišem dvodimenzionalni niz?“
„Možeš koristiti metod Arrays.deepToString().“
String[][] deepArray = new String[][] {{"Chenmo", "Wang Er"}, {"zanimljiv programer"}};
System.out.println(Arrays.deepToString(deepArray));Rezultat ispisa je prikazan ispod.
[[Chenmo, Wang Er], [zanimljiv programer]]Konvencija ispisa POJO klasa
„Kada je reč o ispisu, Sanmej, da ti skrenem pažnju na jednu stvar. U priručniku za Java razvoj kompanije Alibaba postoji sledeća konvencija, pogledaj.“

„Šta je POJO? To je skraćenica od Plain Ordinary Java Object. Uobičajeno je da u veb aplikacijama, kada kreiramo objekat za mapiranje baze podataka, takav objekat nazivamo POJO, i ovakve objekte ne nasleđuju i ne implementiraju klase ili interfejse nijednog drugog Java okvira.“
„Za ovakve klase je najbolje prevazići metod toString(), kako bi bilo zgodno da vidite koja polja objekat zaista sadrži i lakše rešavate probleme.“
„Ako ga ne prevaziđete, ispisani Java objekat će izgledati kao direktan ispis niza — niz znakova koje niko ne razume.“
„Možeš iskoristiti Intellij IDEA da generiše prevaziđeni metod toString(), što je veoma zgodno.“
„Dobro, brate, zapamtila sam. Ubuduće ću obratiti pažnju kada naiđem na to. Idi da se odmoriš, ja ću otkucati kod koji si pomenuo i vežbati.“
„U redu, odlazim, odlazim.“
