Novinky v Javě 8

V první čtvrtině letošního roku vydal Oracle novou verzi Javy a to konkrétně ve verzi 8. Podle slov samotných vývojářů se jedná o největší novinku od vydání Javy. Je to pravda? Pojďme se podívat na jednotlivé novinky. Nová verze Javy přinesla velké množství více či méně zajímavých novinek. My se spolu podíváme na ty nejzajímavější. Konkrétně se podíváme na témata:

  • internet věcí
  • nové API pro datum a čas
  • projekt Nashorn
  • LAMBDA výrazy
  • stream API
  • novinky v zabezpečení

Internet věcí

Tak se na to vrhneme. Jednou z největších novinek je podle Oraclu rozšíření Internetu věcí. V praxi jde o to, že Java nyní podporuje nejrůznější senzory, jež mohou být umístěny například v hodinkách, chytrých náramcích, nebo v jiné nositelné i nenositelné elektronice. To přináší větší robustnost našeho kódu a možnosti používat funkce platformy Java SE 8. Představme si, že vyvíjíme aplikaci pro chytré domácnosti. S novou Javou 8 můžeme pohodlněji pracovat se všemi čidly, které budou v chytré domácnosti potřeba. Dalším příkladem mohou být aplikace, které pracují například s chytrým náramkem a na základě dat získaných z čidel tohoto náramku nám aplikace vypočítavá odhadovaný zdravotní stav.

API pro datum a čas

Další novinku, kterou určitě uvítá každý, kdo pracuje s časovými entitami, je nové API pro datum a čas. Jedná se o package java.time. Pro ty z Vás, kteří uvidíte podobnost s balíčkem JodaTime, máte pravdu. Nejedná se o žádnou kopii tohoto balíčku, ale při vytváření java.time se vývojáři nechali balíčkem JodaTime zřejmě trochu inspirovat a to není vůbec na škodu. Nový balíček podporuje reprezentaci časových údajů například i s časovou zónou, nebo si můžeme vybrat, zda-li chceme pracovat pouze s časem bez data, nebo naopak s datem bez času a podobně. Při vývoji tohoto balíčku se zřejmě nahlíželo na to, aby se s entitami dalo pracovat co nejvíce jako v reálném životě.

Clock clock;
clock = Clock.systemDefaultZone();
System.out.printf("časová zóna: " + clock + "\n");

Nejvíce vítanou novinkou tohoto balíčku je to, že všechny třídy jsou immutable a thread safe. To je vítaná novinka, protože s nimi můžeme pracovat ve více vláknech současně a zároveň se nemusíme starat o synchronizaci. Další věcí, která se mi líbila, je možnost „podvrhnout“ komponentě určitý čas při testování. Doteď pokud jsme nepoužívali JodaTime, museli jsme měnit systémový čas, a to není úplně nejelegantnější řešení. V java.time můžeme komponentě „nainjektovat“ čas, který potřebujeme, a tím například otestovat synchronizaci. V neposlední řadě bych rád také vyzdvihl nové možnosti používat periody. Ačkoliv se to může zdát jako zanedbatelná novinka, určitě nám to ulehčí vývoj aplikací.

LocalDate today = LocalDate.now();
LocalDate bigThing = LocalDate.of(2014, Month.SEPTEMBER, 18);
Period p = Period.between(bigThing, today);
        
long pocet = ChronoUnit.DAYS.between(today,birthday);
        
System.out.println("Do našeho workshopu zbývá už jen " + pocet + " dnů!!");

Projekt Nashorn

Projekt Nashorn je nový JavaScriptový engine, který běží přímo v JVM a umožňuje používat JavaScript v našich Java aplikacích. Tuto možnost nám nabízela už i Mozilla Rhino, ale Nashorn vylepšuje hlavně rychlost provádění JavaScriptového kódu a tím může naše aplikace používat jak prvky Javy, tak prvky JavaScriptu a na výkonu to nebude znát. To je zapříčiněno tím, že celý JavaScriptový kód se překompiluje do bytecode, který interpreter následně vykonává.

Funkcionální programování

Do Javy také dorazilo funkcionální programování v podobě LAMBDA výrazů. Lambda výraz je v podstatě funkce nebo zřetězení funkcí, která pro některé nebo všechny kombinace vstupních hodnot určuje výstupní hodnotu.

Lambda výrazy můžeme použít dvojím způsobem. Buďto použijeme lambda výraz anonymně, nebo za použití funkčního rozhraní můžeme předat lambda výraz například jako parametr metodě. V ukázce vidíme anonymní použití.

Collection<String> name = Arrays.asList("John", "Mary", "Anna");
        name.stream()
                .filter(a -> a.length() < 5)
                .sorted()
                .forEach(a -> System.out.println(a)
);

Stream API

Tak nyní už víme, co to je Lambda a můžeme se podívat na nějaké praktické použití. Nejvíce se používají právě ve Stream API, které se často používá s kolekcemi a na nich si ukážeme i základní práci. Každé kolekci nově přibyla metoda stream, která nám vrací funkcionální pohled. Práce s tímto streamem je podobná s prací v bashi. Používá se tam něco jako pipelina. Tedy máme kolekci, vytvoříme na ní stream a na něj aplikujeme nějakou operaci. Například nějaký filter nebo mapu. Každá tato funkce nám vrátí zase stream a na něj můžeme aplikovat zase jiný filter a podobně. Tyto operace s původní kolekcí nic nedělají, jen změním pohled na stream a nakonec, když už máme provedené všechny „lazy“ operace, tedy ty, co jen mění pohled, použijeme terminal operaci, která upraví stream zase na kolekci. Například použijeme metodu toArray(). Nyní si celý postup ukážeme na příkladu.

List<String> cislaSlovne = Arrays.asList("100", "200", "300", "400");
 int cisla[] = cislaSlovne
 .stream()
 .map(Integer::parseInt)
 .filter(num -> num < 200)
 .toArray();


 

Nejdříve jsme si vytvořili list Stringů, který jsme naplnili čísly. Dále jsme si na našem listu zavolali metodu stream(). Metoda stream() nám vrátila pohled na náš list, který jsme dále upravovali. Abychom mohli s hodnotami v pohledu pracovat jako s čísly, přemapujeme si jednotlivé hodnoty na integery. Posledním krokem jsme si vyfiltrovali všechna čísla, která jsou větší než 200.

Novinky v zabezpečení

Nová Java přináší také novinky v oblasti zabezpečení. Nově přináší nativní podporu TLS. Transport Layer Security neboli TLS jsou protokoly, které umožňují zabezpečenou komunikaci na internetu. TLS zabezpečuje komunikaci proti odposlouchávání nebo falšování zpráv, a to pomocí autentizace pro koncový bod. Jedná se tedy o to, že koncový bod, tedy webová aplikace jako například webový prohlížeč, není autentizován, ale server, se kterým komunikuje, autentizován je, takže prohlížeč vždy ví, s kým komunikuje.

Další novinku ocení všichni ti, kdo plánují svoje data šifrovat. Java 8 přináší totiž nativní podporu NSA Suite B Cryptographic Algorithms, což je balíček algoritmů, které pomáhají uchránit data při transportu přes nezabezpečený internet proti útokům hrubou silou. Tyto algoritmy jsou velmi silné a jejich prolomení je v podstatě nemožné. Další silné algoritmy od NSA jsou obsaženy v balíčku suite A, ten je ale přísně tajný a používá ho USA ve státní správě a o algoritmech v tomto balíčku se neví v podstatě nic. V suitě B jsou obsaženy například algoritmy pro šifrování, které používají klíče s délkou 128 nebo 256 bitů. Dále je obsažen algoritmus pro podporu digitálního podpisu (Elliptic Curve Digital Signature Algorithm (ECDSA). Tento algoritmus používá k zabezpečení eliptických křivek o velikosti 256 a 384 bitů.

Závěr

V tomto článku jsme si shrnuli nejvýraznější novinky v novém vydání Javy. Jedná se určitě o krok správným směrem, který nám přináší nové možnosti, jak rozšířit možnosti vývoje nových druhů aplikací. Ať už se chystáte vytvářet aplikaci, co bude číst data z čidla srdečního tepu, nebo jen chcete efektivněji selektovat hodnoty v kolekci, Java 8 Vám práci ulehčí.