tifyty

pure Java, what else ?

Hogyan fűzzünk össze stringeket Java-ban? s.join(“,”) ?

Tudom, hogy hasonló téma már volt, de ez most egy kicsit más. Most nem csak egymás után akarjuk rakni a sok stringet, és nem az érdekel, hogy sima + vagy StringBuffer hanem az, hogy hogyan készítsünk comma delimited stringet.

Ennek igen sok módja van, és elég gyakran elő is fordul a feladat. A legtöbbször alkalmazott megoldás valami ilyesmi:

	static void join1(String... args) {
		StringBuilder sb = new StringBuilder();
		boolean first = true;
		String separator = " * ";
		for (String s : args) {
			if (first) {
				first = false;
			} else {
				sb.append(separator);
			}
			sb.append(s);
		}
		System.out.println(sb);
	}

Amikor ilyet látok, tudom, hogy fel kell készülnöm a kódban több helyen copy/paste-re, és egyéb nyalánkságokra, mert aki ezt írta nem csak Java-ban, hanem programozásban is kezdő. A következő változat ennek a módosított változata, amelyik kicsit rövidebb, és attól függően, hogy ki olvassa, és milyen az észjárása vagy olvashatóbb, vagy éppen kevésbé olvasható:

	static void join2(String... args) {
		StringBuilder sb = new StringBuilder();
		boolean first = true;
		String separator = " * ";
		for (String s : args) {
			if (!first) {
				sb.append(separator);
			}
			first = false;
			sb.append(s);
		}
		System.out.println(sb);
	}

Van egy olyan pattern is, amelyik összevonja a separator és a first funkcióját, és nem azt mondja, hogy nem teszem be az elem elé a szeparátort, ha ez az első elem, hanem kihasználja, hogy létezik olyan, hogy üres string, és a szeparátor első értéke ez, majd a ciklusban ez megváltozik, és onnan kezdve már elhelyezi a szeparátort:

	static void join3(String... args) {
		StringBuilder sb = new StringBuilder();
		String separator = "";
		for (String s : args) {
			sb.append(separator);
			separator = " * ";
			sb.append(s);
		}
		System.out.println(sb);
	}

És amikor ezt olvasom, akkor tudom, hogy a kódot egy tapasztalt kezdő írta.

Milyen a kód, amit szenior ír?

Mi a különbség a junior és a szenior között? Az, hogy a junior boldogan ír kódot. A szenior viszont már annyi kódot írt, hogy inkább kétszer annyi időt eltölt meglevő megoldások keresésével, mint amibe a kód megírása kerülne. Ezzel ugyan akár még lassabb is lehet, mint egy junior. Persze nem biztos, hisz nem kétszer annyi időt tölt el a kereséssel, mint amennyit a kód megírásával a junior töltene el, csak éppen kétszer annyit, mint amennyi alatt ő maga megírná a kódot. De miért jó ez mégis mégis? Mert a kód karbantartása során, amikor jön valaki két év múlva, akinek karban kell tartania a kódot, ez az idő megtérül, kamatostul. Tehát a szenior ilyen kódot ír:

import org.apache.commons.lang.StringUtils;

  . . .

	static void join4(String... args) {
		String sb = StringUtils.join(args, " * ");
		System.out.println(sb);
	}

vagy éppen ilyent:

import com.google.common.base.Joiner;

  . . .

	static void join5(String... args) {
		String sb = Joiner.on(" * ").join(args);
		System.out.println(sb);
	}

18 responses to “Hogyan fűzzünk össze stringeket Java-ban? s.join(“,”) ?

  1. himadri77 március 28, 2013 11:35 de.

    Teljesen egyetértek, az apache commons verhetetlen! Valójában amikor elkezdem a bejegyzést olvasni, arra gondoltam, hogy a feladathoz hozzátartozik még a sztringekben a separator-ok ki-escape-elése (szép magyar szó!), mint amikor CSV-t generálunk. Ahhoz aztán végképp library kell!

  2. tamasrev március 28, 2013 11:49 de.

    Ez így tökigaz: az a legolcsóbb, ha nem kell szoftvert (modult) fejleszteni. Aztán néha a szenior is megírja a saját cvs printerét, ha mindenféle vállalati policyk miatt nem tölthet le jarokat. És közben dühönghet a senior hogy phpban beépített függvény van ugyanarra.

    (Hasonló okból találkoztam prejava5 rendszerben kézzel kókányolt xml marshallerel.)

  3. tvk március 28, 2013 1:44 du.

    Persze ül a cikk, de egy junior ne húzogasson be a projektbe 3rd party jar-okat senior megkérdezése nélkül.

    • v március 28, 2013 3:05 du.

      És ha nincs a projekten egyáltalán senior, mert kis KFT, aki olcsón fejleszt?

      • Bence március 28, 2013 6:10 du.

        Akkor
        a) az PHP fejlesztés lesz, azon a sportpályán minden sarkon találsz olcsó “fejlesztőt”.
        b) az olcsó “fejlesztő” garantáltan megírja az első join verziót egy alkalmazáson belül többször is

        Miért is kell nekünk saját join metódus, ha van rá kiforrott library?

        Így nap végére mindig kicsit megkukaculok… 😀

        • Mefi március 31, 2013 3:16 de.

          Ezeket az olcsó PHP-fejlesztős dolgokat szerintem lehetne mellőzni, nem 2001-et írunk, és már akkor is gáz volt. 🙂

          Különben a bejegyzéssel nagyon egyetértek, főként azzal, hogy a legrosszabb az, amikor mindenáron meg akarunk írni valamit, amit lehet, sőt, biztos, hogy mások már sokkal jobban megoldottak. (Amire pedig nincs jó megoldás, ott a megoldás létjogosultságán kell elgondolkodni.)

  4. Lexandro március 28, 2013 2:44 du.

    Apache Commons vagy Google Guava hasznalat mar senior szint?

    Ez egy kicsit azert eros kerem… 🙂

    • v március 28, 2013 3:08 du.

      Szükséges, de persze nem elégséges.

    • tvk március 29, 2013 10:46 de.

      Ez pont egy jó példa, mert egyszerű funkcionalitásról van szó és mégis választani kell. Egy senior meg tudja ítélni, hogy az adott projekthez elég lesz-e a Commons a maga 160k-jával, vagy akarják-e használni a Guava szolgáltatásait azon az áron, hogy majdnem 1 megás jar-t kell behúzni. Lehet hogy egyáltalán nem számít a méret, lehet hogy számít. Mostani projektemben pl. számít. Lehet hogy a projekt másik részében, vagy a cégben már van kultúrája a Commons használatának. Akkor nem biztos hogy érdemes behozni a Guava-t, de lehet hogy mégis. Stb.

      Nincs senior, kis Kft és olcsón fejleszt, ezek tök független dolgok. 🙂

  5. Pitta március 29, 2013 1:57 de.

    Java8:
    String sb = String.join(” * “, args);

    Persze ehhez még kell egy kis türelem:)

  6. kirunewsKirály Péter március 29, 2013 6:27 du.

    Úgy emlékszek, hogy valamelyik magyar nyelvű Java könyvben benne van ez a join-os példa, és ott is több lépésben, de megáll a kódolásnál, nem mutat be alternatívát (lehet, hogy akkor még nem is volt). Viszont függetlenül attól, hogy van-e a konkrét esetben meglévő könyvtár vagy sem, a kezdő-szintű kód felvet egy kérdést: nem el olcsóbb-e boolean-t lekérdezni/módosítani egy ciklusban mint Stringet?

  7. mxt március 29, 2013 7:37 du.

    Van-e annak valami konkrét oka, hogy a bejegyzés első bekezdésében StringBuilder helyett StringBuffer-t említ (kiemelve) a szerző? Nem nagyon tudok elképzelni olyan helyzetet, ahol egy mezei konkatenációnál lényeges lenne a thread safety.

  8. mhmxs március 30, 2013 12:27 du.

    A jó Senior Groovy-t használ, és akkor nincs szüksége mindenféle 3rd party lájbörikre, a junior kezét meg eltöri, ha valahová def-et ír típusdefiníció helyett.

  9. Visszajelzés:Hogyan fűzzünk össze stringeket Java8-ban? | tifyty

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: