260 likes | 433 Views
Java 8. Co nowego w Javie 8 SE. Błażej Karwowski. Agenda. Wyrażenia i inne nowości w języku Zmiany w kolekcjach = cześnie Kilka słów o bezpieczeństwie I18N oraz czas i data Java FX – lepszy Swing? N osorożec czyli JavaScript w Javie. λ.
E N D
Java 8 Co nowego w Javie 8 SE Błażej Karwowski
Agenda Wyrażenia i inne nowości w języku Zmiany w kolekcjach =cześnie Kilka słów o bezpieczeństwie I18N oraz czas i data Java FX – lepszy Swing? Nosorożec czyli JavaScript w Javie λ
Wyrażenia λ i inne nowości w języku Zmiany w Javie .............................. ? Znowu? Wyrażenia λ Referencje do metod i metody domyślne Zmiany w adnotacjach Refleksja parametrów metod
Wyrażenia λ Runnable noArguments = () -> System.out.println("Hello World"); ActionListeneroneArgument = event -> System.out.println("button clicked"); RunnablemultiStatement = () -> {System.out.print("Hello");System.out.println(" World");}; BinaryOperator<Long> add = (x, y) -> x + y; BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;
Metody domyślne Dlaczego istnieją? Wielodziedziczenie Przykład: defaultvoidforEach(Consumer<? super T> action) { for (T t : this) { action.accept(t); } }
Zmiany w kolekcjach Obsługa λ, „strumieni” i „operacji agregujących” Poprawa wydajności
Zmiany w kolekcjach – zmienione pakiety Zmodyfikowane pakiety java.util.function java.util.stream Nowe pakiety
Zmiany w kolekcjach – strumienie Cechy: Brak przechowywanych danych Funkcyjne Leniące się :D Potencjalnie nieskończone Zużywalne Sposoby tworzenia: Na podstawie kolekcji za pomocą metod stream() i parallelStream() Z tablic za pomocą Arrays.stream(Object[]) Za pomocą metody wytwórczej np. Stream.of(Object[]), IntStream.range(int, int) Na podstawie linii z pliku za pomocą: BufferedReader.lines() Z klasy Random za pomocą metody ints() Za pomocą wielu innych metod z JDK.
=cześnie czyli współbieżność λ również tutaj Nowe klasy, metody i interfejsy
Przykłady – operacje na strumieniach collect(toList()) List<String> collected = Stream.of("a", "b", "c").collect(Collectors.toList()); map List<String> collected1 = Stream.of("a", "b", "hello") .map(string -> string.toUpperCase()) .collect(Collectors.toList()); filter List<String> beginningWithNumbers = Stream.of("a", "1abc", "abc1") .filter(value -> Character.isDigit(value.charAt(0))) .collect(Collectors.toList());
Przetwarzanie równoległe oraz λ List<Pracownik> pracownicy = Arrays.asList( newPracownik("Adam", "Kowalski", 1.5), newPracownik("Maciej","Majewski", 2.0), newPracownik("Jędrzej", "Kaczmarek", 0.5), newPracownik("Zofia", "Szczepańska", 3.0)); doublesumaCzasupracySzeregowopracownicy.stream().mapToDouble(Pracownik::getStazPracy).sum(); doublesumaCzasupracyRownloegle = pracownicy.parallelStream().mapToDouble(Pracownik::getStazPracy).sum(); double[] values = newdouble[100]; Arrays.parallelSetAll(values, i -> new Random().nextDouble());
Przetwarzanie równoległe oraz λ i [] double[] values = newdouble[100]; Arrays.parallelSetAll(values, i -> new Random().nextDouble()); Arrays.parallelSort(values); Arrays.parallelPrefix(values, Double::sum);
I18N oraz czas i data I18N: Umiędzynarodowienie ThreeTen: Czas dla komputera i człowieka
JSR 310: Date-Time API Prostota Płynność Niezmienność Rozszerzalność
JSR 310: Date-Time API – przykład I System.out.printf("Aktualna data i czas: %s%n", LocalDateTime.now()); System.out.printf("1 lutego 2001 21:10: %s%n", LocalDateTime.of(2001, Month.FEBRUARY, 1, 21, 10)); System.out.printf("Aktualna data i czas: (z Instant): %s%n", LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault())); System.out.printf("Za 6 miesiące będzie: %s%n", LocalDateTime.now().plusMonths(6)); DateTimeFormatterformat = DateTimeFormatter.ofPattern("MMM d yyyyHH:mm"); System.out.printf("6 miesięcy temu było: %s%n", LocalDateTime.now().minusMonths(6).format(format));
JSR 310: Date-Time API – przykład II Instant t1, t2; t1 = Instant.now(); System.in.read(); t2 = Instant.now(); DurationtimeBeetwen = Duration.between(t1, t2); System.out.println("Zmierzony czas: " + timeBeetwen); longtimeBeetwen2 = ChronoUnit.MILLIS.between(t1,t2); longtimeBeetwen3 = ChronoUnit.SECONDS.between(t1,t2); longtimeBeetwen4 = ChronoUnit.HOURS.between(t1,t2); System.out.println("Zmierzony czas: " + timeBeetwen2 + " milisekund."); System.out.println("Zmierzony czas: " + timeBeetwen3 + " sekund."); System.out.println("Zmierzony czas: " + timeBeetwen4 + " godzin.");
JSR 310: Date-Time API – przykład III LocalDatetoday = LocalDate.now(); LocalDatebirthday = LocalDate.of(1983, Month.JANUARY, 29); LocalDatenextBirthday = birthday.withYear(today.getYear()); if (nextBirthday.isBefore(today) || nextBirthday.isEqual(today)) { nextBirthday = nextBirthday.plusYears(1); } Period toNextBirthday = Period.between(today, nextBirthday); System.out.printf("Do następnych urodzin pozostało: %s miesięcy %s dni %n", toNextBirthday.getMonths(),toNextBirthday.getDays());
Java FX 2.x – Lepszy SWING? Zapatrzenie w MacromediaAdobe Flash • FXML and SceneBuilder WebKit – przeglądarka wewnątrz apletu? Grafika 2D i 3D SWING wewnątrz Java FX Canvas API Drukowanie RichText Akceleracja sprzętowa Stremowanie mediów CSS
Bardziej Java niż Script? JavaScript w Javie ? Java SE 6 – Rhino 1.6R2 Java SE 7 – Rhino 1.7R3 Java SE 8 – Nashorn 11 grudnia 2006 28 lipca 2011 18 marca 2014
JavaFX & Nashorn - przykład var Button = javafx.scene.control.Button; varStackPane = javafx.scene.layout.StackPane; varScene = javafx.scene.Scene; function start(primaryStage) { primaryStage.title = "Hello World!"; varbutton = new Button(); button.text = "'Hello World'"; button.onAction = function() print("Hello World!"); varroot = newStackPane(); root.children.add(button); primaryStage.scene = new Scene(root, 300, 250); primaryStage.show(); }