Jak na List

Chtěl jsem napsat rozsáhlejší článeček o kolekcích, ale venku je tak krásně, že se mi do toho moc nechce. Tak napíšu něco kratšího. Začnu kvízovou otázkou: Jaká je nejjednodušší metoda pro vytvoření Listu obsahujícího tři prvky v Javě 5?

Tzn. jak jednoduše udělat něco takového:



    List<String> list = new ArrayList<String>();
    list.add("one");
    list.add("two");
    list.add("three");

V Javě 7 to bude snadné, budeme mít krásný nový literál, který nám přečte myšlenky a udělá to všechno za nás. Navíc to bude mnohem snažší než v Ruby nebo jiném v té době módním jazyce.

Ale jak to udělat v Javě 5? Tak co napadá vás něco?

Abyste měli ještě trochu času, ukaži vám špatné, ale zajímavé řešení.



    List<String> list = new ArrayList<String>();
    Collections.addAll(list, "one","two","three");

Používám zde novou, docela zajímavou funkci z třídy java.util.Collections. Doporučuji vám si tuto třídu nastudovat, v Javě 5 v ní přibyly některé nové zajímavé funkce.

Už jste přišli na to jediné správné řešení? Je to docela snadné:

List<String> list = Arrays.asList("one","two","three");

V Javě 5 se funce Arrays.asList změnila tak, že místo pole Objectů přijímá parametr typu T …, takže nám umožňuje takovýto zápis. Nevýhodou uvedeného řešení je to, že získaný seznam je neměnitelný. Při pokusu například o přidání, dostaneme UnsupportedOperationException.

Abychom se v Javě 5 opravdu vyžili, můžeme zkusit vytvořit seznam čísel.

List<Number> list = Arrays.asList(1,2L,3d);

Toto nám překladač nepovolí. Zablábolí něco takového „Type mismatch: cannot convert from List> to List“. Pokud to chceme vyřešit, musíme mu trochu pomoci a říci, jakého typu by výsledný seznam měl být.

List<Number> list = Arrays.<Number>asList(1,2L,3d);

Otázka je, nakolik bude výsledný kód čitelný. Ale s trochou cviku to jde. Ono se nám to bude hodit na dobu, kdy nám z Javy udělají Ruby.

6 Responses to “Jak na List”

  1. Cyril Says:

    Dalsi moznosti je magicky zapis, ktery byl nutny v java 1.4: new LinkedList(){{add("one");add("two");add("three")}}, ma to jiste nevyhody, ale je to pro javu 1.4 nejratsi....

  2. Padáček Says:

    Napadá mne jedna otázka. Proč zkracovat zápis, když ten základní je nejvíce čitelný?

  3. Martin Rubeš Says:

    Tohle vytvoří list, který lze modifikovat 🙂

    List list = new ArrayList(Arrays.asList("one","two","three"));

    a ještě jedna perla 🙂

    List list = Collections.list(Collections.enumeration(Arrays.asList(1.0 ,2 , 3f)));

  4. Richard Says:

    Je treba povedat, ze kod je daleko rychlejsi - ked sa pouzije Arrays.asList(”one”,”two”,”three”).

  5. Lukáš Křečan Says:

    Zkrácený zápis se hodí například při inicializaci "konstanty". Např.
    public static final List NUMBERS = Arrays.asList("one","two","three");

  6. ja Says:

    nekdy ale potrebujete, aby do listu nemohl nikdo pridavat.
    Ale rozhodne bych se nehonil za nejkratsim zapisem.
    Kod ma zobrazovat algoritmus - citelne a prehledne