30 marca 2014

Java Platform, Standard Edition 8 wydane, więc nauki czas ponownie zacząć, co?

Java Platform, Standard Edition 8 (w skrócie Java SE 8 czy po prostu Java 8) jest już powszechnie dostępne. Wiele się zmieniło i pewnie nie tylko ja chciałbym wiedzieć, na ile Java 8 jest warta poznania, po tym, kiedy zarzucono ją na rzecz innych języków programowania - Clojure, Scala, Groovy. Ty też chciał(a)byś wiedzieć, co się zmieniło w najnowszej wersji Java 8? Najlepiej zacząć prosto u źródła - JDK 8 Release Notes lub What's New in JDK 8. Jest tego sporo do czytania, co może świadczyć o niemałych zmianach i dłużej nauce. Taka nasza informatyczna dola...

Pierwsza ciekawostka dla mnie to nazewnictwo - Java SE 8 vs JDK 8. Nie było to tak oczywiste, bo Java SE 8 to specyfikacja, a JDK 8 jej implementacją od Oracle. Jakoś wcześniej mi to umykało. Tak przynajmniej napisano w dokumentacji.

Mówi się, że najlepszym sposobem na naukę nowego języka jest po prostu korzystać z niego. Dotyczy to języka mówionego i dobrze sprawdza się również z językiem programowania. W ten sposób właśnie zamierzam poznać Java 8. Na swoim blogu proponuję pracę z IntelliJ IDEA 13. Właśnie kilka dni temu wyszła wersja 13.1.1 i wystarczy pobrać bezpłatną wersję Community Edition.

Przy założeniu, że Java 8 została zainstalowana, w IDEA wybierasz Create New Project, a później Java, wciskasz Next, aż pojawi się panel, w którym po raz pierwszy wybieramy Java 8 jako środowisko pracy.


Po stworzeniu projektu, upewnij się, że Project language level ustawiony jest na 8.0 - Lambdas, type annotations, etc.


Mając projekt można zacząć rozpoznawać Java 8 API. Od czego zaczniemy? Może java.util.stream?! A nie inaczej, skoro jest to (wraz z lambdami) jedna z ważniejszych zmian w tej wersji języka.

Za Collections Framework Enhancements in Java SE 8:

"Classes in the new java.util.stream package provide a Stream API to support functional-style operations on streams of elements. The Stream API is integrated into the Collections API, which enables bulk operations on collections, such as sequential or parallel map-reduce transformations."

Zaczniemy właśnie od Stream API, bo rozpoznając ten kawałek Java 8 nie sposób nie dotknąć innych zmian jak chociażby wspomniane lambdy.

Przez Collections Framework Enhancements in Java SE 8 dochodzimy do…i tu znowu cała masa dokumentacji. Zachęcam do lektury New and Enhanced APIs That Take Advantage of Lambda Expressions and Streams in Java SE 8.

Na tej stronie można doświadczyć pierwszego spotkania ze zmianami w Java 8:
Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8 };
List listOfIntegers =
    new ArrayList<>(Arrays.asList(intArray));
    System.out.println("Sum of integers: " +
        listOfIntegers
            .stream()
            .reduce(Integer::sum).get());
Zacznijmy od tego kawałka.

Na początku rzuciło mi się, dlaczego new ArrayList<>(Arrays.asList(intArray)) zamiast po prostu Arrays.asList(intArray)? Pewnie jakaś ukryta wiedza magiczna.

Dla adeptów Java 8 nową metodą w java.util.List<t>, a dokładniej java.util.Collection jest default Stream stream(), który (za javadoc):

"Returns a sequential Stream with this collection as its source."

  1. Po pierwsze, co oznacza default przy sygnaturze?
  2. Po drugie, czym jest Stream?
  3. Po trzecie, skoro stream() zwraca “a sequential Stream”, to czy istnieje inny rodzaj Stream, np. non-sequential?
Wrócimy do tego niebawem.