Java 8 - szybki przewodnik

JAVA 8 to główne wydanie funkcji rozwoju języka programowania JAVA. Jego pierwotna wersja została wydana 18 marca 2014 r. Wraz z wydaniem Java 8 Java zapewniła obsługę programowania funkcjonalnego, nowy silnik JavaScript, nowe interfejsy API do manipulacji datami, nowy interfejs API do przesyłania strumieniowego itp.

Nowe funkcje

  • Lambda expression - Dodaje funkcjonalne możliwości przetwarzania do języka Java.

  • Method references- Odwoływanie się do funkcji za pomocą ich nazw zamiast wywoływania ich bezpośrednio. Używanie funkcji jako parametru.

  • Default method - Interfejs z domyślną implementacją metody.

  • New tools - Dodano nowe narzędzia kompilatora i programy narzędziowe, takie jak „jdeps”, aby znaleźć zależności.

  • Stream API - Nowe API strumieniowe ułatwiające przetwarzanie potoków.

  • Date Time API - Ulepszone API daty i czasu.

  • Optional - Nacisk na najlepsze praktyki prawidłowego postępowania z wartościami zerowymi.

  • Nashorn, JavaScript Engine - Silnik oparty na Javie do wykonywania kodu JavaScript.

Rozważ następujący fragment kodu.

import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;

public class Java8Tester {

   public static void main(String args[]) {
   
      List<String> names1 = new ArrayList<String>();
      names1.add("Mahesh ");
      names1.add("Suresh ");
      names1.add("Ramesh ");
      names1.add("Naresh ");
      names1.add("Kalpesh ");
		
      List<String> names2 = new ArrayList<String>();
      names2.add("Mahesh ");
      names2.add("Suresh ");
      names2.add("Ramesh ");
      names2.add("Naresh ");
      names2.add("Kalpesh ");
		
      Java8Tester tester = new Java8Tester();
      System.out.println("Sort using Java 7 syntax: ");
		
      tester.sortUsingJava7(names1);
      System.out.println(names1);
      System.out.println("Sort using Java 8 syntax: ");
		
      tester.sortUsingJava8(names2);
      System.out.println(names2);
   }
   
   //sort using java 7
   private void sortUsingJava7(List<String> names) {   
      Collections.sort(names, new Comparator<String>() {
         @Override
         public int compare(String s1, String s2) {
            return s1.compareTo(s2);
         }
      });
   }
   
   //sort using java 8
   private void sortUsingJava8(List<String> names) {
      Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
   }
}

Uruchom program, aby uzyskać następujący wynik.

Sort using Java 7 syntax:
[ Kalpesh Mahesh Naresh Ramesh Suresh ]
Sort using Java 8 syntax:
[ Kalpesh Mahesh Naresh Ramesh Suresh ]

Tutaj sortUsingJava8() metoda używa funkcji sortowania z wyrażeniem lambda jako parametrem, aby uzyskać kryteria sortowania.

Konfiguracja środowiska lokalnego

Jeśli chcesz skonfigurować własne środowisko dla języka programowania Java, ta sekcja przeprowadzi Cię przez cały proces. Wykonaj poniższe kroki, aby skonfigurować środowisko Java.

Oprogramowanie Java SE można pobrać bezpłatnie z następującego łącza -

https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html

Pobierasz wersję opartą na systemie operacyjnym.

Postępuj zgodnie z instrukcjami, aby pobrać Javę i uruchomić .exeaby zainstalować Javę na swoim komputerze. Po zainstalowaniu Javy na komputerze należałoby ustawić zmienne środowiskowe, aby wskazywały na prawidłowe katalogi instalacyjne.

Konfigurowanie ścieżki dla systemu Windows 2000 / XP

Zakładając, że zainstalowałeś Javę w katalogu c: \ Program Files \ java \ jdk -

  • Kliknij prawym przyciskiem myszy „Mój komputer” i wybierz „Właściwości”.

  • Kliknij przycisk „Zmienne środowiskowe” na karcie „Zaawansowane”.

  • Teraz zmień zmienną „Path”, tak aby zawierała również ścieżkę do pliku wykonywalnego Java. Na przykład, jeśli ścieżka jest obecnie ustawiona na „C: \ WINDOWS \ SYSTEM32”, ​​zmień ścieżkę na „C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin”.

Konfigurowanie ścieżki dla Windows 95/98 / ME

Zakładając, że zainstalowałeś Javę w katalogu c: \ Program Files \ java \ jdk -

  • Edytuj plik „C: \ autoexec.bat” i dodaj następujący wiersz na końcu -

    SET PATH =% PATH%; C: \ Program Files \ java \ jdk \ bin

Konfigurowanie ścieżki dla systemów Linux, UNIX, Solaris, FreeBSD

Zmienna środowiskowa PATH powinna być ustawiona tak, aby wskazywała, gdzie zostały zainstalowane pliki binarne Java. Zajrzyj do dokumentacji powłoki, jeśli masz z tym problem.

Na przykład, jeśli używasz bash jako powłoki, możesz dodać następujący wiersz na końcu swojego '.bashrc: export PATH = / path / to / java: $ PATH'

Popularne edytory Java

Do pisania programów w języku Java potrzebny jest edytor tekstu. Na rynku dostępne są jeszcze bardziej wyrafinowane środowiska IDE. Ale na razie możesz rozważyć jedną z następujących -

  • Notepad - Na komputerze z systemem Windows możesz użyć dowolnego prostego edytora tekstu, takiego jak Notatnik (zalecany w tym samouczku) lub TextPad.

  • Netbeans- Jest to środowisko Java IDE o otwartym kodzie źródłowym i bezpłatne. Można go pobrać zhttps://netbeans.org/index.html.

  • Eclipse - Jest to również środowisko Java IDE opracowane przez społeczność Open Source Eclipse i można je pobrać z witryny https://www.eclipse.org/.

Wyrażenia lambda zostały wprowadzone w Javie 8 i są reklamowane jako największa cecha Java 8. Wyrażenia lambda ułatwiają programowanie funkcjonalne i bardzo upraszczają programowanie.

Składnia

Wyrażenie lambda charakteryzuje się następującą składnią.

parameter -> expression body

Poniżej przedstawiono ważne cechy wyrażenia lambda.

  • Optional type declaration- Nie ma potrzeby deklarowania typu parametru. Kompilator może wywnioskować to samo z wartości parametru.

  • Optional parenthesis around parameter- Nie ma potrzeby deklarowania pojedynczego parametru w nawiasach. W przypadku wielu parametrów wymagane są nawiasy.

  • Optional curly braces - Nie ma potrzeby używania nawiasów klamrowych w treści wyrażenia, jeśli treść zawiera pojedynczą instrukcję.

  • Optional return keyword- Kompilator automatycznie zwraca wartość, jeśli treść ma jedno wyrażenie zwracające wartość. Nawiasy klamrowe są wymagane, aby wskazać, że wyrażenie zwraca wartość.

Przykład wyrażeń lambda

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester tester = new Java8Tester();
		
      //with type declaration
      MathOperation addition = (int a, int b) -> a + b;
		
      //with out type declaration
      MathOperation subtraction = (a, b) -> a - b;
		
      //with return statement along with curly braces
      MathOperation multiplication = (int a, int b) -> { return a * b; };
		
      //without return statement and without curly braces
      MathOperation division = (int a, int b) -> a / b;
		
      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));
		
      //without parenthesis
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);
		
      //with parenthesis
      GreetingService greetService2 = (message) ->
      System.out.println("Hello " + message);
		
      greetService1.sayMessage("Mahesh");
      greetService2.sayMessage("Suresh");
   }
	
   interface MathOperation {
      int operation(int a, int b);
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
	
   private int operate(int a, int b, MathOperation mathOperation) {
      return mathOperation.operation(a, b);
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh

Poniżej przedstawiono ważne punkty, które należy wziąć pod uwagę w powyższym przykładzie.

  • Wyrażenia lambda są używane przede wszystkim do definiowania wbudowanej implementacji interfejsu funkcjonalnego, tj. Interfejsu z tylko jedną metodą. W powyższym przykładzie użyliśmy różnych typów wyrażeń lambda do zdefiniowania sposobu działania interfejsu MathOperation. Następnie zdefiniowaliśmy implementację sayMessage z GreetingService.

  • Wyrażenie lambda eliminuje potrzebę anonimowej klasy i zapewnia bardzo proste, ale potężne możliwości programowania funkcjonalnego w Javie.

Zakres

Używając wyrażenia lambda, możesz odwołać się do dowolnej zmiennej końcowej lub faktycznie zmiennej końcowej (która jest przypisywana tylko raz). Wyrażenie lambda zgłasza błąd kompilacji, jeśli zmiennej przypisano wartość po raz drugi.

Przykład zakresu

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

public class Java8Tester {

   final static String salutation = "Hello! ";
   
   public static void main(String args[]) {
      GreetingService greetService1 = message -> 
      System.out.println(salutation + message);
      greetService1.sayMessage("Mahesh");
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

Hello! Mahesh

Odnośniki do metod pomagają wskazać metody według ich nazw. Odwołanie do metody jest opisane za pomocą symbolu „::”. Odniesienia do metody można użyć do wskazania następujących typów metod -

  • Metody statyczne
  • Metody instancji
  • Konstruktorzy używający nowego operatora (TreeSet :: new)

Przykład odniesienia metody

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

import java.util.List;
import java.util.ArrayList;

public class Java8Tester {

   public static void main(String args[]) {
      List names = new ArrayList();
		
      names.add("Mahesh");
      names.add("Suresh");
      names.add("Ramesh");
      names.add("Naresh");
      names.add("Kalpesh");
		
      names.forEach(System.out::println);
   }
}

Tutaj przekazaliśmy metodę System.out :: println jako odwołanie do metody statycznej.

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

Mahesh
Suresh
Ramesh
Naresh
Kalpesh

Funkcjonalne interfejsy mają jedną funkcję do pokazania. Na przykład do celów porównawczych używany jest porównywalny interfejs z pojedynczą metodą „compareTo”. W Javie 8 zdefiniowano wiele funkcjonalnych interfejsów, które mają być szeroko stosowane w wyrażeniach lambda. Poniżej znajduje się lista funkcjonalnych interfejsów zdefiniowanych w pakiecie java.util.Function.

Sr.No. Interfejs i opis
1

BiConsumer<T,U>

Reprezentuje operację, która akceptuje dwa argumenty wejściowe i nie zwraca żadnego wyniku.

2

BiFunction<T,U,R>

Reprezentuje funkcję, która przyjmuje dwa argumenty i generuje wynik.

3

BinaryOperator<T>

Reprezentuje operację na dwóch operandach tego samego typu, dając wynik tego samego typu co operandy.

4

BiPredicate<T,U>

Reprezentuje predykat (funkcję o wartościach logicznych) dwóch argumentów.

5

BooleanSupplier

Reprezentuje dostawcę wyników o wartościach logicznych.

6

Consumer<T>

Reprezentuje operację, która akceptuje pojedynczy argument wejściowy i nie zwraca żadnego wyniku.

7

DoubleBinaryOperator

Reprezentuje operację na dwóch operandach o podwójnej wartości i generującą wynik o podwójnej wartości.

8

DoubleConsumer

Reprezentuje operację, która akceptuje pojedynczy argument o podwójnej wartości i nie zwraca żadnego wyniku.

9

DoubleFunction<R>

Reprezentuje funkcję, która akceptuje argument o podwójnej wartości i generuje wynik.

10

DoublePredicate

Reprezentuje predykat (funkcję o wartościach logicznych) jednego argumentu o podwójnej wartości.

11

DoubleSupplier

Reprezentuje dostawcę wyników o podwójnej wartości.

12

DoubleToIntFunction

Reprezentuje funkcję, która akceptuje argument o podwójnej wartości i generuje wynik o wartości wewnętrznej.

13

DoubleToLongFunction

Reprezentuje funkcję, która akceptuje argument o podwójnej wartości i generuje wynik o długiej wartości.

14

DoubleUnaryOperator

Reprezentuje operację na pojedynczym operandzie o podwójnej wartości, która daje wynik o podwójnej wartości.

15

Function<T,R>

Reprezentuje funkcję, która przyjmuje jeden argument i generuje wynik.

16

IntBinaryOperator

Reprezentuje operację na dwóch operandach o wartości wewnętrznej i generuje wynik o wartości wewnętrznej.

17

IntConsumer

Reprezentuje operację, która akceptuje pojedynczy argument o wartości wewnętrznej i nie zwraca żadnego wyniku.

18

IntFunction<R>

Reprezentuje funkcję, która akceptuje argument o wartości wewnętrznej i generuje wynik.

19

IntPredicate

Reprezentuje predykat (funkcję o wartościach logicznych) jednego argumentu o wartości wewnętrznej.

20

IntSupplier

Reprezentuje dostawcę wyników z wyceną wewnętrzną.

21

IntToDoubleFunction

Reprezentuje funkcję, która akceptuje argument o wartości wewnętrznej i generuje wynik o podwójnej wartości.

22

IntToLongFunction

Reprezentuje funkcję, która akceptuje argument o wartości wewnętrznej i generuje wynik o długiej wartości.

23

IntUnaryOperator

Reprezentuje operację na pojedynczym operandzie o wartości wewnętrznej, który daje wynik o wartości wewnętrznej.

24

LongBinaryOperator

Reprezentuje operację na dwóch operandach o długiej wartości i generuje wynik o długiej wartości.

25

LongConsumer

Reprezentuje operację, która akceptuje pojedynczy argument o długiej wartości i nie zwraca żadnego wyniku.

26

LongFunction<R>

Reprezentuje funkcję, która akceptuje argument o długiej wartości i generuje wynik.

27

LongPredicate

Reprezentuje predykat (funkcję o wartości logicznej) jednego argumentu o długiej wartości.

28

LongSupplier

Reprezentuje dostawcę cenionych wyników.

29

LongToDoubleFunction

Reprezentuje funkcję, która akceptuje argument o długiej wartości i generuje wynik o podwójnej wartości.

30

LongToIntFunction

Reprezentuje funkcję, która akceptuje argument o długiej wartości i generuje wynik o wartości wewnętrznej.

31

LongUnaryOperator

Reprezentuje operację na pojedynczym operandzie o długiej wartości, która daje wynik o długiej wartości.

32

ObjDoubleConsumer<T>

Reprezentuje operację, która akceptuje argument o wartościach obiektu i podwójnej wartości i nie zwraca żadnego wyniku.

33

ObjIntConsumer<T>

Reprezentuje operację, która akceptuje argument o wartościach obiektu i wartości wewnętrznej i nie zwraca żadnego wyniku.

34

ObjLongConsumer<T>

Reprezentuje operację, która akceptuje argument o wartościach obiektu i argument o długiej wartości i nie zwraca żadnego wyniku.

35

Predicate<T>

Reprezentuje predykat (funkcję o wartości logicznej) jednego argumentu.

36

Supplier<T>

Reprezentuje dostawcę wyników.

37

ToDoubleBiFunction<T,U>

Reprezentuje funkcję, która przyjmuje dwa argumenty i generuje wynik o podwójnej wartości.

38

ToDoubleFunction<T>

Reprezentuje funkcję, która generuje wynik o podwójnej wartości.

39

ToIntBiFunction<T,U>

Reprezentuje funkcję, która akceptuje dwa argumenty i generuje wynik o wartości int.

40

ToIntFunction<T>

Reprezentuje funkcję, która generuje wynik o wartości wewnętrznej.

41

ToLongBiFunction<T,U>

Reprezentuje funkcję, która przyjmuje dwa argumenty i generuje wynik o długiej wartości.

42

ToLongFunction<T>

Reprezentuje funkcję, która generuje wynik o dużej wartości.

43

UnaryOperator<T>

Reprezentuje operację na pojedynczym operandzie, która daje wynik tego samego typu, co jego operand.

Przykład interfejsu funkcjonalnego

Interfejs Predicate <T> jest interfejsem funkcjonalnym z metodą test (Object) zwracającą wartość logiczną. Ten interfejs oznacza, że ​​obiekt jest testowany jako prawdziwy lub fałszywy.

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class Java8Tester {

   public static void main(String args[]) {
      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
		
      // Predicate<Integer> predicate = n -> true
      // n is passed as parameter to test method of Predicate interface
      // test method will always return true no matter what value n has.
		
      System.out.println("Print all numbers:");
		
      //pass n as parameter
      eval(list, n->true);
		
      // Predicate<Integer> predicate1 = n -> n%2 == 0
      // n is passed as parameter to test method of Predicate interface
      // test method will return true if n%2 comes to be zero
		
      System.out.println("Print even numbers:");
      eval(list, n-> n%2 == 0 );
		
      // Predicate<Integer> predicate2 = n -> n > 3
      // n is passed as parameter to test method of Predicate interface
      // test method will return true if n is greater than 3.
		
      System.out.println("Print numbers greater than 3:");
      eval(list, n-> n > 3 );
   }
	
   public static void eval(List<Integer> list, Predicate<Integer> predicate) {

      for(Integer n: list) {

         if(predicate.test(n)) {
            System.out.println(n + " ");
         }
      }
   }
}

Tutaj przekazaliśmy interfejs Predicate, który pobiera pojedyncze dane wejściowe i zwraca wartość logiczną.

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

Print all numbers:
1
2
3
4
5
6
7
8
9
Print even numbers:
2
4
6
8
Print numbers greater than 3:
4
5
6
7
8
9

Java 8 wprowadza nową koncepcję domyślnej implementacji metod w interfejsach. Ta funkcja została dodana w celu zapewnienia zgodności z poprzednimi wersjami, aby można było używać starych interfejsów do wykorzystania możliwości wyrażenia lambda w języku Java 8.

Na przykład interfejsy „List” lub „Collection” nie mają deklaracji metody „forEach”. Dlatego dodanie takiej metody po prostu przerwie implementacje struktury kolekcji. Java 8 wprowadza metodę domyślną, dzięki czemu interfejs List / Collection może mieć domyślną implementację metody forEach, a klasa implementująca te interfejsy nie musi implementować tego samego.

Składnia

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
}

Wiele wartości domyślnych

Przy domyślnych funkcjach w interfejsach istnieje możliwość, że klasa implementuje dwa interfejsy z tymi samymi domyślnymi metodami. Poniższy kod wyjaśnia, jak można rozwiązać tę niejednoznaczność.

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
}

public interface fourWheeler {

   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

Pierwszym rozwiązaniem jest utworzenie własnej metody, która zastępuje domyślną implementację.

public class car implements vehicle, fourWheeler {

   public void print() {
      System.out.println("I am a four wheeler car vehicle!");
   }
}

Drugim rozwiązaniem jest wywołanie domyślnej metody określonego interfejsu za pomocą super.

public class car implements vehicle, fourWheeler {

   public void print() {
      vehicle.super.print();
   }
}

Statyczne metody domyślne

Interfejs może mieć również statyczne metody pomocnicze, począwszy od języka Java 8.

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
	
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

Przykład metody domyślnej

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

public class Java8Tester {

   public static void main(String args[]) {
      Vehicle vehicle = new Car();
      vehicle.print();
   }
}

interface Vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
	
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

interface FourWheeler {

   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

class Car implements Vehicle, FourWheeler {

   public void print() {
      Vehicle.super.print();
      FourWheeler.super.print();
      Vehicle.blowHorn();
      System.out.println("I am a car!");
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!

Stream to nowa warstwa abstrakcyjna wprowadzona w Javie 8. Używając stream, można przetwarzać dane w sposób deklaratywny, podobnie jak instrukcje SQL. Weźmy na przykład pod uwagę następującą instrukcję SQL.

SELECT max(salary), employee_id, employee_name FROM Employee

Powyższe wyrażenie SQL automatycznie zwraca informacje o maksymalnym wynagrodzeniu pracownika, bez wykonywania jakichkolwiek obliczeń po stronie programisty. Korzystając ze struktury kolekcji w Javie, programista musi używać pętli i powtarzać testy. Kolejnym problemem jest wydajność; Ponieważ procesory wielordzeniowe są łatwo dostępne, programista Java musi napisać równoległe przetwarzanie kodu, które może być dość podatne na błędy.

Aby rozwiązać takie problemy, Java 8 wprowadziła koncepcję strumienia, która pozwala programistom przetwarzać dane w sposób deklaratywny i wykorzystywać architekturę wielordzeniową bez konieczności pisania dla niej określonego kodu.

Co to jest Stream?

Stream reprezentuje sekwencję obiektów ze źródła, które obsługuje operacje agregujące. Poniżej przedstawiono charakterystykę strumienia -

  • Sequence of elements- Strumień dostarcza zestaw elementów określonego typu w sposób sekwencyjny. Strumień pobiera / oblicza elementy na żądanie. Nigdy nie przechowuje elementów.

  • Source - Stream pobiera kolekcje, tablice lub zasoby we / wy jako źródło wejściowe.

  • Aggregate operations - Stream obsługuje zagregowane operacje, takie jak filtrowanie, mapowanie, ograniczanie, zmniejszanie, znajdowanie, dopasowywanie i tak dalej.

  • Pipelining- Większość operacji na strumieniu zwraca sam strumień, dzięki czemu ich wynik może być potokowany. Operacje te nazywane są operacjami pośrednimi, a ich funkcją jest pobieranie danych wejściowych, przetwarzanie ich i zwracanie danych wyjściowych do celu. metoda collect () to operacja terminalowa, która zwykle występuje na końcu operacji pipeliningu, aby zaznaczyć koniec strumienia.

  • Automatic iterations - Operacje strumieniowe wykonują iteracje wewnętrznie na dostarczonych elementach źródłowych, w przeciwieństwie do kolekcji, w których wymagana jest jawna iteracja.

Generowanie strumieni

W Javie 8 interfejs Collection ma dwie metody generowania strumienia.

  • stream() - Zwraca sekwencyjny strumień, biorąc pod uwagę kolekcję jako źródło.

  • parallelStream() - Zwraca strumień równoległy, biorąc pod uwagę kolekcję jako źródło.

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

dla każdego

Stream udostępnił nową metodę „forEach” do iteracji każdego elementu strumienia. Poniższy segment kodu pokazuje, jak wydrukować 10 liczb losowych za pomocą forEach.

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

mapa

Metoda „map” służy do odwzorowywania każdego elementu na odpowiadający mu wynik. Poniższy segment kodu drukuje unikalne kwadraty liczb przy użyciu map.

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

//get list of unique squares
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

filtr

Metoda „filtru” służy do eliminacji elementów na podstawie kryteriów. Poniższy segment kodu drukuje liczbę pustych ciągów przy użyciu filtru.

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

//get count of empty string
int count = strings.stream().filter(string -> string.isEmpty()).count();

limit

Metoda „limit” służy do zmniejszania rozmiaru strumienia. Poniższy segment kodu pokazuje, jak wydrukować 10 liczb losowych przy użyciu limitu.

Random random = new Random();
random.ints().limit(10).forEach(System.out::println);

posortowane

Do sortowania strumienia używana jest metoda „sortowania”. Poniższy segment kodu pokazuje, jak wydrukować 10 liczb losowych w posortowanej kolejności.

Random random = new Random();
random.ints().limit(10).sorted().forEach(System.out::println);

Przetwarzanie równoległe

parallelStream jest alternatywą dla strumienia do przetwarzania równoległego. Przyjrzyj się poniższemu segmentowi kodu, który drukuje liczbę pustych ciągów przy użyciu parallelStream.

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

//get count of empty string
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();

Przełączanie się między strumieniami sekwencyjnymi i równoległymi jest bardzo łatwe.

Kolekcjonerzy

Kolektory służą do łączenia wyniku przetwarzania na elementach strumienia. Kolektory mogą służyć do zwracania listy lub ciągu znaków.

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

System.out.println("Filtered List: " + filtered);
String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("Merged String: " + mergedString);

Statystyka

W Javie 8 wprowadzono kolektory statystyk, które obliczają wszystkie statystyki podczas przetwarzania strumieniowego.

List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();

System.out.println("Highest number in List : " + stats.getMax());
System.out.println("Lowest number in List : " + stats.getMin());
System.out.println("Sum of all numbers : " + stats.getSum());
System.out.println("Average of all numbers : " + stats.getAverage());

Przykład transmisji

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.Map;

public class Java8Tester {

   public static void main(String args[]) {
      System.out.println("Using Java 7: ");
		
      // Count empty strings
      List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
      System.out.println("List: " +strings);
      long count = getCountEmptyStringUsingJava7(strings);
		
      System.out.println("Empty Strings: " + count);
      count = getCountLength3UsingJava7(strings);
		
      System.out.println("Strings of length 3: " + count);
		
      //Eliminate empty string
      List<String> filtered = deleteEmptyStringsUsingJava7(strings);
      System.out.println("Filtered List: " + filtered);
		
      //Eliminate empty string and join using comma.
      String mergedString = getMergedStringUsingJava7(strings,", ");
      System.out.println("Merged String: " + mergedString);
      List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
		
      //get list of square of distinct numbers
      List<Integer> squaresList = getSquares(numbers);
      System.out.println("Squares List: " + squaresList);
      List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
		
      System.out.println("List: " +integers);
      System.out.println("Highest number in List : " + getMax(integers));
      System.out.println("Lowest number in List : " + getMin(integers));
      System.out.println("Sum of all numbers : " + getSum(integers));
      System.out.println("Average of all numbers : " + getAverage(integers));
      System.out.println("Random Numbers: ");
		
      //print ten random numbers
      Random random = new Random();
		
      for(int i = 0; i < 10; i++) {
         System.out.println(random.nextInt());
      }
		
      System.out.println("Using Java 8: ");
      System.out.println("List: " +strings);
		
      count = strings.stream().filter(string->string.isEmpty()).count();
      System.out.println("Empty Strings: " + count);
		
      count = strings.stream().filter(string -> string.length() == 3).count();
      System.out.println("Strings of length 3: " + count);
		
      filtered = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
      System.out.println("Filtered List: " + filtered);
		
      mergedString = strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.joining(", "));
      System.out.println("Merged String: " + mergedString);
		
      squaresList = numbers.stream().map( i ->i*i).distinct().collect(Collectors.toList());
      System.out.println("Squares List: " + squaresList);
      System.out.println("List: " +integers);
		
      IntSummaryStatistics stats = integers.stream().mapToInt((x) ->x).summaryStatistics();
		
      System.out.println("Highest number in List : " + stats.getMax());
      System.out.println("Lowest number in List : " + stats.getMin());
      System.out.println("Sum of all numbers : " + stats.getSum());
      System.out.println("Average of all numbers : " + stats.getAverage());
      System.out.println("Random Numbers: ");
		
      random.ints().limit(10).sorted().forEach(System.out::println);
		
      //parallel processing
      count = strings.parallelStream().filter(string -> string.isEmpty()).count();
      System.out.println("Empty Strings: " + count);
   }
	
   private static int getCountEmptyStringUsingJava7(List<String> strings) {
      int count = 0;

      for(String string: strings) {
		
         if(string.isEmpty()) {
            count++;
         }
      }
      return count;
   }
	
   private static int getCountLength3UsingJava7(List<String> strings) {
      int count = 0;
		
      for(String string: strings) {
		
         if(string.length() == 3) {
            count++;
         }
      }
      return count;
   }
	
   private static List<String> deleteEmptyStringsUsingJava7(List<String> strings) {
      List<String> filteredList = new ArrayList<String>();
		
      for(String string: strings) {
		
         if(!string.isEmpty()) {
             filteredList.add(string);
         }
      }
      return filteredList;
   }
	
   private static String getMergedStringUsingJava7(List<String> strings, String separator) {
      StringBuilder stringBuilder = new StringBuilder();
		
      for(String string: strings) {
		
         if(!string.isEmpty()) {
            stringBuilder.append(string);
            stringBuilder.append(separator);
         }
      }
      String mergedString = stringBuilder.toString();
      return mergedString.substring(0, mergedString.length()-2);
   }
	
   private static List<Integer> getSquares(List<Integer> numbers) {
      List<Integer> squaresList = new ArrayList<Integer>();
		
      for(Integer number: numbers) {
         Integer square = new Integer(number.intValue() * number.intValue());
			
         if(!squaresList.contains(square)) {
            squaresList.add(square);
         }
      }
      return squaresList;
   }
	
   private static int getMax(List<Integer> numbers) {
      int max = numbers.get(0);
		
      for(int i = 1;i < numbers.size();i++) {
		
         Integer number = numbers.get(i);
			
         if(number.intValue() > max) {
            max = number.intValue();
         }
      }
      return max;
   }
	
   private static int getMin(List<Integer> numbers) {
      int min = numbers.get(0);
		
      for(int i= 1;i < numbers.size();i++) {
         Integer number = numbers.get(i);
		
         if(number.intValue() < min) {
            min = number.intValue();
         }
      }
      return min;
   }
	
   private static int getSum(List numbers) {
      int sum = (int)(numbers.get(0));
		
      for(int i = 1;i < numbers.size();i++) {
         sum += (int)numbers.get(i);
      }
      return sum;
   }
	
   private static int getAverage(List<Integer> numbers) {
      return getSum(numbers) / numbers.size();
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

Using Java 7:
List: [abc, , bc, efg, abcd, , jkl]
Empty Strings: 2
Strings of length 3: 3
Filtered List: [abc, bc, efg, abcd, jkl]
Merged String: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
List: [1, 2, 13, 4, 15, 6, 17, 8, 19]
Highest number in List : 19
Lowest number in List : 1
Sum of all numbers : 85
Average of all numbers : 9
Random Numbers:
-1279735475
903418352
-1133928044
-1571118911
628530462
18407523
-881538250
-718932165
270259229
421676854
Using Java 8:
List: [abc, , bc, efg, abcd, , jkl]
Empty Strings: 2
Strings of length 3: 3
Filtered List: [abc, bc, efg, abcd, jkl]
Merged String: abc, bc, efg, abcd, jkl
Squares List: [9, 4, 49, 25]
List: [1, 2, 13, 4, 15, 6, 17, 8, 19]
Highest number in List : 19
Lowest number in List : 1
Sum of all numbers : 85
Average of all numbers : 9.444444444444445
Random Numbers:
-1009474951
-551240647
-2484714
181614550
933444268
1227850416
1579250773
1627454872
1683033687
1798939493
Empty Strings: 2

Opcjonalny to obiekt kontenera używany do zawierania obiektów niezerowych. Opcjonalny obiekt jest używany do reprezentowania wartości null z brakiem wartości. Ta klasa ma różne metody narzędziowe, które ułatwiają kodowi obsługę wartości jako „dostępne” lub „niedostępne” zamiast sprawdzania wartości null. Został wprowadzony w Javie 8 i jest podobny do tego, co Opcjonalne jest w Guava.

Deklaracja klasy

Poniżej znajduje się deklaracja dla java.util.Optional<T> klasa -

public final class Optional<T> extends Object

Metoda klasowa

Sr.No. Metoda i opis
1

static <T> Optional<T> empty()

Zwraca puste wystąpienie opcjonalne.

2

boolean equals(Object obj)

Wskazuje, czy jakiś inny obiekt jest „równy” temu opcjonalnemu.

3

Optional<T> filter(Predicate<? super <T> predicate)

Jeśli wartość jest obecna, a wartość jest zgodna z danym predykatem, zwraca parametr opcjonalny opisujący wartość, w przeciwnym razie zwraca pusty parametr opcjonalny.

4

<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

Jeśli wartość jest obecna, stosuje do niej podaną funkcję mapowania z opcjonalnym łożyskiem, zwraca wynik, w przeciwnym razie zwraca puste pole Optional.

5

T get()

Jeśli wartość jest obecna w tym opcjonalnym, zwraca wartość, w przeciwnym razie zgłasza NoSuchElementException.

6

int hashCode()

Zwraca wartość kodu skrótu bieżącej wartości, jeśli istnieje, lub 0 (zero), jeśli nie ma żadnej wartości.

7

void ifPresent(Consumer<? super T> consumer)

Jeśli wartość jest obecna, wywołuje określonego konsumenta z wartością, w przeciwnym razie nic nie robi.

8

boolean isPresent()

Zwraca true, jeśli istnieje wartość, w przeciwnym razie false.

9

<U>Optional<U> map(Function<? super T,? extends U> mapper)

Jeśli wartość jest obecna, stosuje do niej podaną funkcję odwzorowania, a jeśli wynik jest różny od null, zwraca parametr Optional opisujący wynik.

10

static <T> Optional<T> of(T value)

Zwraca wartość opcjonalną z określoną obecną wartością różną od null.

11

static <T> Optional<T> ofNullable(T value)

Zwraca opcjonalny opisujący określoną wartość, jeśli jest różny od null, w przeciwnym razie zwraca pusty parametr Optional.

12

T orElse(T other)

Zwraca wartość, jeśli jest obecna, w przeciwnym razie zwraca wartość other.

13

T orElseGet(Supplier<? extends T> other)

Zwraca wartość, jeśli jest obecna, w przeciwnym razie wywołuje inne i zwraca wynik tego wywołania.

14

<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

Zwraca zawartą wartość, jeśli jest obecna, w przeciwnym razie zgłasza wyjątek do utworzenia przez podanego dostawcę.

15

String toString()

Zwraca niepustą reprezentację ciągu tego opcjonalnego odpowiedniego do debugowania.

Ta klasa dziedziczy metody z następującej klasy -

  • java.lang.Object

Opcjonalny przykład

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

import java.util.Optional;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8Tester = new Java8Tester();
      Integer value1 = null;
      Integer value2 = new Integer(10);
		
      //Optional.ofNullable - allows passed parameter to be null.
      Optional<Integer> a = Optional.ofNullable(value1);
		
      //Optional.of - throws NullPointerException if passed parameter is null
      Optional<Integer> b = Optional.of(value2);
      System.out.println(java8Tester.sum(a,b));
   }
	
   public Integer sum(Optional<Integer> a, Optional<Integer> b) {
      //Optional.isPresent - checks the value is present or not
		
      System.out.println("First parameter is present: " + a.isPresent());
      System.out.println("Second parameter is present: " + b.isPresent());
		
      //Optional.orElse - returns the value if present otherwise returns
      //the default value passed.
      Integer value1 = a.orElse(new Integer(0));
		
      //Optional.get - gets the value, value should be present
      Integer value2 = b.get();
      return value1 + value2;
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

First parameter is present: false
Second parameter is present: true
10

Wraz z Java 8, Nashorn, wprowadzono znacznie ulepszony silnik javascript, który zastępuje istniejący Rhino. Nashorn zapewnia od 2 do 10 razy lepszą wydajność, ponieważ bezpośrednio kompiluje kod w pamięci i przekazuje kod bajtowy do maszyny JVM. Nashorn używa funkcji dynamiki wywołania, wprowadzonej w Javie 7 w celu poprawy wydajności.

jjs

W przypadku silnika Nashorn JAVA 8 wprowadza nowe narzędzie wiersza poleceń, jjs, do wykonywania kodów javascript w konsoli.

Interpretowanie pliku js

Utwórz i zapisz plik sample.js w folderze c: \> JAVA.

sample.js

print('Hello World!');

Otwórz konsolę i użyj następującego polecenia.

C:\JAVA>jjs sample.js

Wygeneruje następujący wynik:

Hello World!

jjs w trybie interaktywnym

Otwórz konsolę i użyj następującego polecenia.

C:\JAVA>jjs
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
>>

Przekaż argumenty

Otwórz konsolę i użyj następującego polecenia.

C:\JAVA> jjs -- a b c
jjs> print('letters: ' +arguments.join(", "))
letters: a, b, c
jjs>

Wywołanie JavaScript z Java

Za pomocą ScriptEngineManager można wywoływać i interpretować kod JavaScript w języku Java.

Przykład

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

public class Java8Tester {

   public static void main(String args[]) {
      ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
      ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
		
      String name = "Mahesh";
      Integer result = null;
      
      try {
         nashorn.eval("print('" + name + "')");
         result = (Integer) nashorn.eval("10 + 2");
         
      } catch(ScriptException e) {
         System.out.println("Error executing script: "+ e.getMessage());
      }
      System.out.println(result.toString());
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

Mahesh
12

Wywołanie Java z JavaScript

Poniższy przykład wyjaśnia, jak importować i używać klas Java w skrypcie java.

Utwórz i zapisz sample.js w folderze c: \> JAVA.

sample.js

var BigDecimal = Java.type('java.math.BigDecimal');

function calculate(amount, percentage) {

   var result = new BigDecimal(amount).multiply(new BigDecimal(percentage)).divide(
      new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN);
   
   return result.toPlainString();
}
var result = calculate(568000000000000000023,13.9);
print(result);

Otwórz konsolę i użyj następującego polecenia.

C:\JAVA>jjs sample.js

Powinien dać następujący wynik -

78952000000000000003.20

Wraz z Javą 8 wprowadzono nowy interfejs API daty i godziny, aby pokryć następujące wady starego interfejsu API daty i godziny.

  • Not thread safe- java.util.Date nie jest bezpieczna dla wątków, dlatego programiści muszą radzić sobie z problemem współbieżności podczas korzystania z date. Nowy interfejs API daty i godziny jest niezmienny i nie ma metod ustawiających.

  • Poor design- Data domyślna zaczyna się od 1900, miesiąc zaczyna się od 1, a dzień zaczyna się od 0, więc brak jednolitości. Stary interfejs API miał mniej bezpośrednie metody operacji na datach. Nowy interfejs API zapewnia wiele narzędzi do takich operacji.

  • Difficult time zone handling- Deweloperzy musieli napisać dużo kodu, aby poradzić sobie z problemami ze strefą czasową. Nowy interfejs API został opracowany z myślą o projektowaniu specyficznym dla domeny.

Java 8 wprowadza nowy interfejs API daty i czasu w pakiecie java.time. Poniżej znajduje się kilka ważnych klas wprowadzonych w pakiecie java.time.

  • Local - Uproszczony interfejs API daty i czasu bez złożoności obsługi stref czasowych.

  • Zoned - Specjalistyczny interfejs API daty i czasu do obsługi różnych stref czasowych.

Lokalny interfejs API daty i godziny

Klasy LocalDate / LocalTime i LocalDateTime upraszczają programowanie, w którym strefy czasowe nie są wymagane. Zobaczmy je w akcji.

Utwórz następujący program java przy użyciu dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.Month;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testLocalDateTime();
   }
	
   public void testLocalDateTime() {
      // Get the current date and time
      LocalDateTime currentTime = LocalDateTime.now();
      System.out.println("Current DateTime: " + currentTime);
		
      LocalDate date1 = currentTime.toLocalDate();
      System.out.println("date1: " + date1);
		
      Month month = currentTime.getMonth();
      int day = currentTime.getDayOfMonth();
      int seconds = currentTime.getSecond();
		
      System.out.println("Month: " + month +"day: " + day +"seconds: " + seconds);
		
      LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);
      System.out.println("date2: " + date2);
		
      //12 december 2014
      LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
      System.out.println("date3: " + date3);
		
      //22 hour 15 minutes
      LocalTime date4 = LocalTime.of(22, 15);
      System.out.println("date4: " + date4);
		
      //parse a string
      LocalTime date5 = LocalTime.parse("20:15:30");
      System.out.println("date5: " + date5);
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

Current DateTime: 2014-12-09T11:00:45.457
date1: 2014-12-09
Month: DECEMBERday: 9seconds: 45
date2: 2012-12-10T11:00:45.457
date3: 2014-12-12
date4: 22:15
date5: 20:15:30

Strefowy interfejs API daty i godziny

Strefowy interfejs API daty i czasu ma być używany, gdy brana jest pod uwagę strefa czasowa. Zobaczmy je w akcji.

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

import java.time.ZonedDateTime;
import java.time.ZoneId;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testZonedDateTime();
   }
	
   public void testZonedDateTime() {
      // Get the current date and time
      ZonedDateTime date1 = ZonedDateTime.parse("2007-12-03T10:15:30+05:30[Asia/Karachi]");
      System.out.println("date1: " + date1);
		
      ZoneId id = ZoneId.of("Europe/Paris");
      System.out.println("ZoneId: " + id);
		
      ZoneId currentZone = ZoneId.systemDefault();
      System.out.println("CurrentZone: " + currentZone);
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

date1: 2007-12-03T10:15:30+05:00[Asia/Karachi]
ZoneId: Europe/Paris
CurrentZone: Etc/UTC

Chrono Units Enum

Wyliczenie java.time.temporal.ChronoUnit jest dodawane w Javie 8 w celu zastąpienia wartości całkowitych używanych w starym API do reprezentowania dnia, miesiąca itp. Zobaczmy je w akcji.

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testChromoUnits();
   }
	
   public void testChromoUnits() {
      //Get the current date
      LocalDate today = LocalDate.now();
      System.out.println("Current date: " + today);
		
      //add 1 week to the current date
      LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);
      System.out.println("Next week: " + nextWeek);
		
      //add 1 month to the current date
      LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS);
      System.out.println("Next month: " + nextMonth);
		
      //add 1 year to the current date
      LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);
      System.out.println("Next year: " + nextYear);
		
      //add 10 years to the current date
      LocalDate nextDecade = today.plus(1, ChronoUnit.DECADES);
      System.out.println("Date after ten year: " + nextDecade);
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

Current date: 2014-12-10
Next week: 2014-12-17
Next month: 2015-01-10
Next year: 2015-12-10
Date after ten year: 2024-12-10

Okres i czas trwania

W Javie 8 wprowadzono dwie wyspecjalizowane klasy zajmujące się różnicami czasu.

  • Period - Zajmuje się ilością czasu opartą na dacie.

  • Duration - Zajmuje się ilością czasu opartą na czasie.

Zobaczmy je w akcji.

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

import java.time.temporal.ChronoUnit;

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Duration;
import java.time.Period;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testPeriod();
      java8tester.testDuration();
   }
	
   public void testPeriod() {
      //Get the current date
      LocalDate date1 = LocalDate.now();
      System.out.println("Current date: " + date1);
		
      //add 1 month to the current date
      LocalDate date2 = date1.plus(1, ChronoUnit.MONTHS);
      System.out.println("Next month: " + date2);
      
      Period period = Period.between(date2, date1);
      System.out.println("Period: " + period);
   }
	
   public void testDuration() {
      LocalTime time1 = LocalTime.now();
      Duration twoHours = Duration.ofHours(2);
		
      LocalTime time2 = time1.plus(twoHours);
      Duration duration = Duration.between(time1, time2);
		
      System.out.println("Duration: " + duration);
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

Current date: 2014-12-10
Next month: 2015-01-10
Period: P-1M
Duration: PT2H

Dostrajacze Czasu

TemporalAdjuster służy do wykonywania matematyki daty. Na przykład wybierz „Druga sobota miesiąca” lub „Następny wtorek”. Zobaczmy je w akcji.

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.time.DayOfWeek;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testAdjusters();
   }
	
   public void testAdjusters() {
      //Get the current date
      LocalDate date1 = LocalDate.now();
      System.out.println("Current date: " + date1);
		
      //get the next tuesday
      LocalDate nextTuesday = date1.with(TemporalAdjusters.next(DayOfWeek.TUESDAY));
      System.out.println("Next Tuesday on : " + nextTuesday);
		
      //get the second saturday of next month
      LocalDate firstInYear = LocalDate.of(date1.getYear(),date1.getMonth(), 1);
      LocalDate secondSaturday = firstInYear.with(TemporalAdjusters.nextOrSame(
         DayOfWeek.SATURDAY)).with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
      System.out.println("Second Saturday on : " + secondSaturday);
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

Current date: 2014-12-10
Next Tuesday on : 2014-12-16
Second Saturday on : 2014-12-13

Kompatybilność wsteczna

Metoda toInstant () jest dodawana do oryginalnych obiektów Date i Calendar, których można użyć do przekonwertowania ich na nowy interfejs API Date-Time. Użyj metody ofInstant (Insant, ZoneId), aby pobrać obiekt LocalDateTime lub ZonedDateTime. Zobaczmy je w akcji.

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy, C: \> JAVA.

Java8Tester.java

import java.time.LocalDateTime;
import java.time.ZonedDateTime;

import java.util.Date;

import java.time.Instant;
import java.time.ZoneId;

public class Java8Tester {

   public static void main(String args[]) {
      Java8Tester java8tester = new Java8Tester();
      java8tester.testBackwardCompatability();
   }
	
   public void testBackwardCompatability() {
      //Get the current date
      Date currentDate = new Date();
      System.out.println("Current date: " + currentDate);
		
      //Get the instant of current date in terms of milliseconds
      Instant now = currentDate.toInstant();
      ZoneId currentZone = ZoneId.systemDefault();
		
      LocalDateTime localDateTime = LocalDateTime.ofInstant(now, currentZone);
      System.out.println("Local date: " + localDateTime);
		
      ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(now, currentZone);
      System.out.println("Zoned date: " + zonedDateTime);
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

Current date: Wed Dec 10 05:44:06 UTC 2014
Local date: 2014-12-10T05:44:06.635
Zoned date: 2014-12-10T05:44:06.635Z[Etc/UTC]

Wraz z Javą 8, Base64 wreszcie spełnił swoje zadanie. Java 8 ma teraz wbudowany koder i dekoder do kodowania Base64. W Javie 8 możemy użyć trzech typów kodowania Base64.

  • Simple- Wyjście jest mapowane na zestaw znaków leżących w A-Za-z0-9 + /. Koder nie dodaje żadnego nowego wiersza na wyjściu, a dekoder odrzuca dowolny znak inny niż A-Za-z0-9 + /.

  • URL- Wyjście jest mapowane na zestaw znaków leżących w A-Za-z0-9 + _. Dane wyjściowe są bezpieczne dla adresu URL i nazwy pliku.

  • MIME- Wyjście jest mapowane na format przyjazny dla MIME. Dane wyjściowe są przedstawiane w wierszach zawierających nie więcej niż 76 znaków każdy i używają znaku powrotu karetki „\ r”, po którym następuje wysuw wiersza „\ n” jako separatora wiersza. Na końcu zakodowanego wyjścia nie ma separatora linii.

Klasy zagnieżdżone

Sr.No. Zagnieżdżona klasa i opis
1

static class Base64.Decoder

Ta klasa implementuje dekoder do dekodowania danych bajtowych przy użyciu schematu kodowania Base64, jak określono w RFC 4648 i RFC 2045.

2

static class Base64.Encoder

Ta klasa implementuje koder do kodowania danych bajtowych przy użyciu schematu kodowania Base64 określonego w dokumentach RFC 4648 i RFC 2045.

Metody

Sr.No. Nazwa i opis metody
1

static Base64.Decoder getDecoder()

Zwraca Base64.Decoder, który dekoduje przy użyciu schematu kodowania base64 typu podstawowego.

2

static Base64.Encoder getEncoder()

Zwraca Base64.Encoder, który koduje przy użyciu schematu kodowania base64 typu podstawowego.

3

static Base64.Decoder getMimeDecoder()

Zwraca Base64.Decoder, który dekoduje przy użyciu schematu dekodowania base64 typu MIME.

4

static Base64.Encoder getMimeEncoder()

Zwraca Base64.Encoder, który koduje przy użyciu schematu kodowania base64 typu MIME.

5

static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)

Zwraca Base64.Encoder, który koduje przy użyciu schematu kodowania base64 typu MIME z określoną długością i separatorami linii.

6

static Base64.Decoder getUrlDecoder()

Zwraca Base64.Decoder, który dekoduje przy użyciu schematu kodowania base64 bezpiecznego typu adresu URL i nazwy pliku.

7

static Base64.Encoder getUrlEncoder()

Zwraca Base64.Encoder, który koduje przy użyciu schematu kodowania base64 bezpiecznego typu adresu URL i nazwy pliku.

Dziedziczone metody

Ta klasa dziedziczy metody z następującej klasy -

  • java.lang.Object

Przykład Base64

Utwórz następujący program Java za pomocą dowolnego wybranego edytora w, powiedzmy C: /> JAVA.

Java8Tester.java

import java.util.Base64;
import java.util.UUID;
import java.io.UnsupportedEncodingException;

public class HelloWorld {

   public static void main(String args[]) {

      try {
		
         // Encode using basic encoder
         String base64encodedString = Base64.getEncoder().encodeToString(
            "TutorialsPoint?java8".getBytes("utf-8"));
         System.out.println("Base64 Encoded String (Basic) :" + base64encodedString);
		
         // Decode
         byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
		
         System.out.println("Original String: " + new String(base64decodedBytes, "utf-8"));
         base64encodedString = Base64.getUrlEncoder().encodeToString(
            "TutorialsPoint?java8".getBytes("utf-8"));
         System.out.println("Base64 Encoded String (URL) :" + base64encodedString);
		
         StringBuilder stringBuilder = new StringBuilder();
		
         for (int i = 0; i < 10; ++i) {
            stringBuilder.append(UUID.randomUUID().toString());
         }
		
         byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
         String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
         System.out.println("Base64 Encoded String (MIME) :" + mimeEncodedString);

      } catch(UnsupportedEncodingException e) {
         System.out.println("Error :" + e.getMessage());
      }
   }
}

Sprawdź wynik

Skompiluj klasę przy użyciu javac kompilator w następujący sposób -

C:\JAVA>javac Java8Tester.java

Teraz uruchom Java8Tester w następujący sposób -

C:\JAVA>java Java8Tester

Powinien dać następujący wynik -

Base64 Encoded String (Basic) :VHV0b3JpYWxzUG9pbnQ/amF2YTg=
Original String: TutorialsPoint?java8
Base64 Encoded String (URL) :VHV0b3JpYWxzUG9pbnQ_amF2YTg=
Base64 Encoded String (MIME) :YmU3NWY2ODktNGM5YS00ODlmLWI2MTUtZTVkOTk2YzQ1Njk1Y2EwZTg2OTEtMmRiZC00YTQ1LWJl
NTctMTI1MWUwMTk0ZWQyNDE0NDAwYjgtYTYxOS00NDY5LTllYTctNjc1YzE3YWJhZTk1MTQ2MDQz
NDItOTAyOC00ZWI0LThlOTYtZWU5YzcwNWQyYzVhMTQxMWRjYTMtY2MwNi00MzU0LTg0MTgtNGQ1
MDkwYjdiMzg2ZTY0OWU5MmUtZmNkYS00YWEwLTg0MjQtYThiOTQxNDQ2YzhhNTVhYWExZjItNjU2
Mi00YmM4LTk2ZGYtMDE4YmY5ZDZhMjkwMzM3MWUzNDMtMmQ3MS00MDczLWI0Y2UtMTQxODE0MGU5
YjdmYTVlODUxYzItN2NmOS00N2UyLWIyODQtMThlMWVkYTY4M2Q1YjE3YTMyYmItZjllMS00MTFk
LWJiM2UtM2JhYzUxYzI5OWI4