2015. március 3., kedd

Java SE 8 - Stream API bevezető

Legutóbb a Java 8 funkcionális interfészeivel ismerkedtünk meg, most pedig következzen a Stream API. A Java 8 könyvtárakhoz kapcsolódó legnagyobb változások a Collections API-t érintették, többek között megalkották a Stream API-t, amivel a Collection-ben lévő objektumokat - kihasználva a Lambda kifejezések lehetőségeit - most már stream-ként is feldolgozhatunk.

A Stream API előtti időkben ha egy listát akartunk bejárni, akkor külső (external) iterációt alkalmaztunk, ami feleslegesen terjengőssé tette a kódot valamint a párhuzamosított végrehajtásra való átállás esetén az egészet újra kellett írnunk. A Stream API egy olyan fluent megoldást ad a kezünkbe, ahol nem kell külön for ciklusokat definiálnunk, az iteráció (internal) részleteit lekezeli az API.
List<String> fruitList = 
 Arrays.asList("Alma","BaNÁN","KÖRTE","szILVA","BaracKok","kiwi");

// external iteration
long xcount = 0;
for (String str : fruitList) {
 if (str.length() == 4)
  xcount++;
}
System.out.println(xcount); //2

// internal iteration with Stream API
xcount=fruitList.stream().filter(str -> str.length() == 4).count()
System.out.println(xcount); //2
Az fenti kódrészlet megszámolja a 4 karakteres String-eket a Java 8 előtti és a Stream API által bevezetett iteráció használatával. Az internal iterációnál maradva, a stream() hívással elkérjük a listában található objektumok stream-jét, majd a Lambda kifejezést használó intermediate filter() művelettel kiválogatjuk a 4 karaktereseket, végül a count() terminate hívással lekérdezzük ezen elemek darabszámát. Érdemes tudni, hogy az intermediate műveletek csupán konfigurációs (lazy) feladatot látnak el, a tényleges bejárás a terminate (eager) művelet során történik meg.
Set<String> set = fruitList.stream()
 .filter(str -> str.length() != 4)
 .map(str -> str.toUpperCase()).collect(Collectors.toSet());

System.out.println(set); // [BARACKOK, KÖRTE, BANÁN, SZILVA]
A következő példa a nem 4 karakteres Stringeket nagybetűssé alakítja, majd az eredményt egy Set-be teszi. A map() konfigurációs művelet az értékeket egy másik értékre konvertálja át, az esetünkben minden egyes String-et - ami a filter()-ben definiált feltételnek megfelel - nagybetűssé alakít. A collect() hívással megkezdődik a Stream feldolgozása és a megfelelő objektumok bekerülnek az új Set-be.

A folytatásban további példákat fogok mutatni a Stream API használatára. De most legyen egy kis házi feladat: a filter() és a map() milyen funkcionális interfészt használ paraméterként?

2015. február 17., kedd

Code Monkey Island - Társasjáték ifjú kódereknek

A Code Monkey Island egy újabb társasjáték azoknak a 8+ éves gyerekeknek, akik játékos formában szeretnének a kódolás alapjaival megismerkedni. A Robot Turtles társasjátékhoz hasonlóan ez is egy Kickstarter-es projektként indult és napok alatt elérték a megcélzott összeget. A játék során megtanulható a vezérlési szerkezetek, adatstruktúrák, boolean logikai műveletek, értékadás és néhány matematikai művelet használata is.

A játékot mindenki 3 utasítás kártyával kezdi, amiből ki kell választani egyet amikor sorra kerülünk és a megadott utasítást végrehajtani, majd húzni kell egy új lapot. A programozás tanulás az utasítás kártyák alkalmazásában rejlik, melyekből néhány az alábbi képen is látható. A játék során találkozhatunk más állatokkal és gyümölcsökkel is amelyek extra lépéseket adnak. Végül az a játékos nyer, akinél mind a három majom leghamarabb körbeér a sziget körül.


Ami tetszett:
  • Jó ötlet a programozási koncepciók alkalmazásához
  • Tetszett a színvilág és az ábrák kivitelezése a kártyákon
  • Többen is játszhatják, így jó hangulatban fog telni a tanulás
Ami nem tetszett:
  • Egy társasjátékokhoz képest magas ár: 40$+30$ szállítás: 18.000Ft


2015. február 11., szerda

Robot Turtles - Társasjáték Logo alapokon

A robotok után nézzük meg azt a társasjátékot, ami a kickstarter történetében a legtöbb támogatót szerezte meg a táblajátékok kategóriában, ez pedig a Robot teknősök. A Primo-hoz hasonlóan, ez is a Logo alapjain nyugszik és a játékhoz még olvasni sem kell tudniuk a gyerekeknek.

A játékot négyen játszhatják egyszerre. Mindenki kiválaszt egy adott színű teknőst és az ehhez tartozó kártyákat magához veszi, majd fel kell építeni egy labirintust a falakat ábrázoló kártyákkal, ahova ékszereket ábrázoló kártyákat is elhelyezünk. A játék célja, hogy a teknősöket el kell juttatni az ékszerekhez, úgy hogy utasításokat tartalmazó kártyákat (előre lép, jobbra fordul, balra fordul) egymás mellé letesszük a megfelelő sorrendben. A kezdeti időszakban amikor a gyerekek leraknak egy kártyát, a teknőst egyből mozgathatjuk a megfelelő irányba, később amikor már belejöttek a játékba csak a teljes lépés sorozat megadása után. Hiba esetén (pl. ha falnak mentünk), kiáltani kell hogy bug van a kódban és a debuggolás során javítani kell a hibát.


Ahogy a gyerekek egyre profibbá válnak, úgy újabb kártya típusokat lehet hozzáadni a játékhoz. Ilyen például a jégfal, amit a lézer kártyával át lehet vágni vagy a béka akinek kioszthatunk egy feladatot mint lépés sorozatot, amit később bármikor meghívhatunk mint egy függvényt.

Ami tetszett:
  • Jó ötlet volt a Logo-t átültetni társasjáték formába
  • Fokozatosan új kártya típusok vihetők be a játékba (jégfal, béka)
  • Az egész család játszhat vele, mivel mindenki nyer így nincsenek vesztesek
  • Nem kell hozzá számítógép és mobil telefon sem
  • Megfizethető és a magyar verzió is megvásárolható (6.000Ft)
Ami nem tetszett:
  • Nem hasonlítható ahhoz, mint amikor egy valódi robot elkezd működni a kódod alapján, habár itt most nem is az a cél