Java 8 - Panduan Cepat

JAVA 8 adalah rilis fitur utama pengembangan bahasa pemrograman JAVA. Versi awalnya dirilis pada 18 Maret 2014. Dengan rilis Java 8, Java menyediakan dukungan untuk pemrograman fungsional, mesin JavaScript baru, API baru untuk manipulasi waktu tanggal, API streaming baru, dll.

Fitur baru

  • Lambda expression - Menambahkan kemampuan pemrosesan fungsional ke Java.

  • Method references- Merujuk fungsi dengan namanya alih-alih memanggilnya secara langsung. Menggunakan fungsi sebagai parameter.

  • Default method - Antarmuka memiliki implementasi metode default.

  • New tools - Alat dan utilitas kompilator baru ditambahkan seperti 'jdeps' untuk mengetahui dependensi.

  • Stream API - API aliran baru untuk memfasilitasi pemrosesan pipa.

  • Date Time API - Peningkatan tanggal waktu API.

  • Optional - Penekanan pada praktik terbaik untuk menangani nilai null dengan benar.

  • Nashorn, JavaScript Engine - Mesin berbasis Java untuk mengeksekusi kode JavaScript.

Perhatikan cuplikan kode berikut.

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));
   }
}

Jalankan programnya untuk mendapatkan hasil sebagai berikut.

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

Di sini sortUsingJava8() Metode menggunakan fungsi sortir dengan ekspresi lambda sebagai parameter untuk mendapatkan kriteria pengurutan.

Pengaturan Lingkungan Lokal

Jika Anda ingin mengatur lingkungan Anda sendiri untuk bahasa pemrograman Java, maka bagian ini memandu Anda melalui keseluruhan proses. Silakan ikuti langkah-langkah yang diberikan di bawah ini untuk mengatur lingkungan Java Anda.

Java SE dapat diunduh secara gratis dari tautan berikut -

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

Anda mengunduh versi berdasarkan sistem operasi Anda.

Ikuti petunjuk untuk mengunduh Java, dan jalankan .exeuntuk menginstal Java di komputer Anda. Setelah Anda menginstal Java di komputer Anda, Anda perlu mengatur variabel lingkungan agar mengarah ke direktori instalasi yang benar.

Menyiapkan Path untuk Windows 2000 / XP

Dengan asumsi Anda telah menginstal Java di direktori c: \ Program Files \ java \ jdk -

  • Klik kanan pada 'My Computer' dan pilih 'Properties'.

  • Klik tombol 'Variabel lingkungan' di bawah tab 'Lanjutan'.

  • Sekarang, ubah variabel 'Path' sehingga juga berisi path ke Java yang dapat dieksekusi. Misalnya, jika jalur saat ini disetel ke 'C: \ WINDOWS \ SYSTEM32', ubah jalur Anda menjadi 'C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin'.

Menyiapkan Path untuk Windows 95/98 / ME

Dengan asumsi Anda telah menginstal Java di direktori c: \ Program Files \ java \ jdk -

  • Edit file 'C: \ autoexec.bat' dan tambahkan baris berikut di akhir -

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

Menyiapkan Path untuk Linux, UNIX, Solaris, FreeBSD

Variabel lingkungan PATH harus disetel agar mengarah ke tempat biner Java telah dipasang. Lihat dokumentasi shell Anda jika Anda kesulitan melakukan ini.

Misalnya, jika Anda menggunakan bash sebagai shell Anda, maka Anda akan menambahkan baris berikut di akhir '.bashrc: export PATH = / path / to / java: $ PATH'

Editor Java Populer

Untuk menulis program Java, Anda membutuhkan editor teks. Ada IDE yang lebih canggih yang tersedia di pasaran. Tetapi untuk saat ini, Anda dapat mempertimbangkan salah satu dari yang berikut -

  • Notepad - Pada mesin Windows, Anda dapat menggunakan editor teks sederhana seperti Notepad (disarankan untuk tutorial ini) atau TextPad.

  • Netbeans- Ini adalah IDE Java yang open-source dan gratis. Itu dapat diunduh darihttps://netbeans.org/index.html.

  • Eclipse - Ini juga merupakan IDE Java yang dikembangkan oleh komunitas sumber terbuka Eclipse dan dapat diunduh dari https://www.eclipse.org/.

Ekspresi Lambda diperkenalkan di Java 8 dan disebut-sebut sebagai fitur terbesar dari Java 8. Ekspresi Lambda memfasilitasi pemrograman fungsional, dan banyak menyederhanakan pengembangan.

Sintaksis

Ekspresi lambda dicirikan oleh sintaks berikut.

parameter -> expression body

Berikut adalah karakteristik penting dari ekspresi lambda.

  • Optional type declaration- Tidak perlu mendeklarasikan tipe parameter. Kompilator dapat melakukan inferensi yang sama dari nilai parameter.

  • Optional parenthesis around parameter- Tidak perlu mendeklarasikan parameter tunggal dalam tanda kurung. Untuk beberapa parameter, diperlukan tanda kurung.

  • Optional curly braces - Tidak perlu menggunakan kurung kurawal pada badan ekspresi jika isi mengandung satu pernyataan.

  • Optional return keyword- Kompilator secara otomatis mengembalikan nilai jika badan memiliki ekspresi tunggal untuk mengembalikan nilai. Tanda kurung kurawal diperlukan untuk menunjukkan bahwa ekspresi mengembalikan nilai.

Contoh Ekspresi Lambda

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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);
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan keluaran berikut -

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

Berikut adalah poin penting yang harus diperhatikan dalam contoh di atas.

  • Ekspresi Lambda digunakan terutama untuk mendefinisikan implementasi inline dari antarmuka fungsional, yaitu antarmuka dengan metode tunggal saja. Dalam contoh di atas, kami telah menggunakan berbagai jenis ekspresi lambda untuk menentukan metode operasi antarmuka MathOperation. Kemudian kita telah mendefinisikan implementasi sayMessage dari GreetingService.

  • Ekspresi Lambda menghilangkan kebutuhan akan kelas anonim dan memberikan kemampuan pemrograman fungsional yang sangat sederhana namun kuat ke Java.

Cakupan

Dengan menggunakan ekspresi lambda, Anda dapat merujuk ke variabel akhir atau variabel akhir secara efektif (yang hanya diberikan sekali). Ekspresi Lambda memunculkan kesalahan kompilasi, jika variabel diberi nilai untuk kedua kalinya.

Contoh Ruang Lingkup

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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);
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan keluaran berikut -

Hello! Mahesh

Referensi metode membantu untuk menunjukkan metode dengan namanya. Referensi metode dideskripsikan menggunakan simbol "::". Referensi metode dapat digunakan untuk menunjukkan jenis metode berikut -

  • Metode statis
  • Metode instance
  • Konstruktor menggunakan operator baru (TreeSet :: new)

Contoh Referensi Metode

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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);
   }
}

Di sini kita telah mengirimkan metode System.out :: println sebagai referensi metode statis.

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan keluaran berikut -

Mahesh
Suresh
Ramesh
Naresh
Kalpesh

Antarmuka fungsional memiliki satu fungsi untuk dipamerkan. Misalnya, antarmuka yang Dapat Dibandingkan dengan metode tunggal 'bandingkanTo' digunakan untuk tujuan perbandingan. Java 8 telah mendefinisikan banyak antarmuka fungsional untuk digunakan secara ekstensif dalam ekspresi lambda. Berikut adalah daftar antarmuka fungsional yang didefinisikan dalam paket java.util.Function.

Sr.No. Antarmuka & Deskripsi
1

BiConsumer<T,U>

Merepresentasikan operasi yang menerima dua argumen input, dan tidak mengembalikan hasil.

2

BiFunction<T,U,R>

Merepresentasikan fungsi yang menerima dua argumen dan menghasilkan hasil.

3

BinaryOperator<T>

Merepresentasikan operasi pada dua operan dengan tipe yang sama, menghasilkan hasil dengan tipe yang sama seperti operan.

4

BiPredicate<T,U>

Merepresentasikan predikat (fungsi bernilai Boolean) dari dua argumen.

5

BooleanSupplier

Mewakili pemasok hasil yang bernilai Boolean.

6

Consumer<T>

Merepresentasikan operasi yang menerima satu argumen input dan tidak mengembalikan hasil.

7

DoubleBinaryOperator

Mewakili operasi pada dua operan bernilai ganda dan menghasilkan hasil bernilai ganda.

8

DoubleConsumer

Merepresentasikan operasi yang menerima satu argumen bernilai ganda dan tidak mengembalikan hasil.

9

DoubleFunction<R>

Merepresentasikan fungsi yang menerima argumen bernilai ganda dan menghasilkan hasil.

10

DoublePredicate

Merepresentasikan predikat (fungsi bernilai Boolean) dari satu argumen bernilai ganda.

11

DoubleSupplier

Merupakan pemasok hasil bernilai ganda.

12

DoubleToIntFunction

Merepresentasikan fungsi yang menerima argumen bernilai ganda dan menghasilkan hasil yang bernilai int.

13

DoubleToLongFunction

Merepresentasikan fungsi yang menerima argumen bernilai ganda dan menghasilkan hasil bernilai panjang.

14

DoubleUnaryOperator

Merepresentasikan operasi pada operand bernilai ganda tunggal yang menghasilkan hasil bernilai ganda.

15

Function<T,R>

Merepresentasikan fungsi yang menerima satu argumen dan menghasilkan hasil.

16

IntBinaryOperator

Merepresentasikan operasi pada dua operan int-nilai dan menghasilkan hasil int-nilai.

17

IntConsumer

Merepresentasikan operasi yang menerima satu argumen bernilai int dan tidak mengembalikan hasil.

18

IntFunction<R>

Merepresentasikan fungsi yang menerima argumen int-nilai dan menghasilkan hasil.

19

IntPredicate

Merepresentasikan predikat (fungsi bernilai Boolean) dari satu argumen bernilai int.

20

IntSupplier

Mewakili pemasok hasil yang bernilai int.

21

IntToDoubleFunction

Merepresentasikan fungsi yang menerima argumen nilai int dan menghasilkan hasil nilai ganda.

22

IntToLongFunction

Merepresentasikan fungsi yang menerima argumen bernilai int dan menghasilkan hasil bernilai panjang.

23

IntUnaryOperator

Merepresentasikan operasi pada operand nilai int tunggal yang menghasilkan hasil nilai int.

24

LongBinaryOperator

Merepresentasikan operasi pada dua operan bernilai lama dan menghasilkan hasil bernilai panjang.

25

LongConsumer

Merepresentasikan operasi yang menerima satu argumen bernilai panjang dan tidak mengembalikan hasil.

26

LongFunction<R>

Merepresentasikan fungsi yang menerima argumen bernilai panjang dan memberikan hasil.

27

LongPredicate

Merepresentasikan predikat (fungsi bernilai Boolean) dari satu argumen bernilai panjang.

28

LongSupplier

Mewakili pemasok hasil yang bernilai lama.

29

LongToDoubleFunction

Merepresentasikan fungsi yang menerima argumen bernilai panjang dan menghasilkan hasil bernilai ganda.

30

LongToIntFunction

Merepresentasikan fungsi yang menerima argumen bernilai panjang dan menghasilkan hasil bernilai int.

31

LongUnaryOperator

Merepresentasikan operasi pada operand tunggal bernilai panjang yang menghasilkan hasil bernilai panjang.

32

ObjDoubleConsumer<T>

Merepresentasikan operasi yang menerima argumen bernilai objek dan argumen bernilai ganda, dan tidak mengembalikan hasil.

33

ObjIntConsumer<T>

Merepresentasikan operasi yang menerima argumen bernilai objek dan nilai int, dan tidak mengembalikan hasil.

34

ObjLongConsumer<T>

Merepresentasikan operasi yang menerima argumen bernilai objek dan bernilai panjang, dan tidak mengembalikan hasil.

35

Predicate<T>

Merepresentasikan predikat (fungsi bernilai Boolean) dari satu argumen.

36

Supplier<T>

Merupakan pemasok hasil.

37

ToDoubleBiFunction<T,U>

Merepresentasikan fungsi yang menerima dua argumen dan menghasilkan hasil bernilai ganda.

38

ToDoubleFunction<T>

Merepresentasikan fungsi yang menghasilkan hasil bernilai ganda.

39

ToIntBiFunction<T,U>

Merepresentasikan fungsi yang menerima dua argumen dan menghasilkan hasil int-nilai.

40

ToIntFunction<T>

Merepresentasikan fungsi yang menghasilkan hasil int-valued.

41

ToLongBiFunction<T,U>

Merepresentasikan fungsi yang menerima dua argumen dan menghasilkan hasil yang bernilai panjang.

42

ToLongFunction<T>

Merepresentasikan fungsi yang menghasilkan hasil yang bernilai panjang.

43

UnaryOperator<T>

Merepresentasikan operasi pada operan tunggal yang menghasilkan hasil dengan tipe yang sama seperti operannya.

Contoh Antarmuka Fungsional

Predikat <T> antarmuka adalah antarmuka fungsional dengan tes metode (Objek) untuk mengembalikan nilai Boolean. Antarmuka ini menandakan bahwa suatu objek diuji benar atau salah.

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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 + " ");
         }
      }
   }
}

Di sini kita telah melewati antarmuka Predicate, yang mengambil satu input dan mengembalikan Boolean.

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan keluaran berikut -

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 memperkenalkan konsep baru implementasi metode default di antarmuka. Kemampuan ini ditambahkan untuk kompatibilitas mundur sehingga antarmuka lama dapat digunakan untuk memanfaatkan kemampuan ekspresi lambda Java 8.

Misalnya, antarmuka 'List' atau 'Collection' tidak memiliki deklarasi metode 'forEach'. Jadi, menambahkan metode seperti itu hanya akan merusak implementasi kerangka kumpulan. Java 8 memperkenalkan metode default sehingga antarmuka Daftar / Koleksi dapat memiliki implementasi default metode forEach, dan kelas yang mengimplementasikan antarmuka ini tidak perlu mengimplementasikan hal yang sama.

Sintaksis

public interface vehicle {

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

Beberapa Default

Dengan fungsi default di antarmuka, ada kemungkinan bahwa kelas mengimplementasikan dua antarmuka dengan metode default yang sama. Kode berikut menjelaskan bagaimana ambiguitas ini dapat diselesaikan.

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!");
   }
}

Solusi pertama adalah membuat metode sendiri yang menggantikan implementasi default.

public class car implements vehicle, fourWheeler {

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

Solusi kedua adalah memanggil metode default dari antarmuka yang ditentukan menggunakan super.

public class car implements vehicle, fourWheeler {

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

Metode Default Statis

Sebuah antarmuka juga dapat memiliki metode pembantu statis mulai dari Java 8 dan seterusnya.

public interface vehicle {

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

Contoh Metode Default

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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!");
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan keluaran berikut -

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

Stream adalah layer abstrak baru yang diperkenalkan di Java 8. Menggunakan stream, Anda dapat memproses data dengan cara deklaratif yang mirip dengan pernyataan SQL. Misalnya, perhatikan pernyataan SQL berikut.

SELECT max(salary), employee_id, employee_name FROM Employee

Ekspresi SQL di atas secara otomatis mengembalikan detail karyawan yang digaji maksimum, tanpa melakukan penghitungan apa pun di pihak pengembang. Menggunakan kerangka koleksi di Java, pengembang harus menggunakan loop dan melakukan pemeriksaan berulang. Perhatian lainnya adalah efisiensi; karena prosesor multi-inti tersedia dengan mudah, pengembang Java harus menulis pemrosesan kode paralel yang bisa sangat rawan kesalahan.

Untuk mengatasi masalah tersebut, Java 8 memperkenalkan konsep aliran yang memungkinkan pengembang memproses data secara deklaratif dan memanfaatkan arsitektur multicore tanpa perlu menulis kode khusus untuk itu.

Apa itu Stream?

Stream mewakili urutan objek dari sumber, yang mendukung operasi agregat. Berikut ini adalah karakteristik Arus -

  • Sequence of elements- Aliran menyediakan satu set elemen tipe tertentu secara berurutan. Aliran mendapatkan / menghitung elemen sesuai permintaan. Itu tidak pernah menyimpan elemen.

  • Source - Stream mengambil Sumber Daya Koleksi, Array, atau I / O sebagai sumber input.

  • Aggregate operations - Aliran mendukung operasi agregat seperti filter, peta, batas, kurangi, temukan, cocokkan, dan sebagainya.

  • Pipelining- Sebagian besar operasi aliran mengembalikan aliran itu sendiri sehingga hasilnya dapat disalurkan. Operasi ini disebut operasi perantara dan fungsinya adalah untuk mengambil input, memprosesnya, dan mengembalikan output ke target. Metode collect () adalah operasi terminal yang biasanya ada di akhir operasi pemipaan untuk menandai akhir aliran.

  • Automatic iterations - Operasi aliran melakukan iterasi secara internal atas elemen sumber yang disediakan, berbeda dengan Koleksi yang memerlukan iterasi eksplisit.

Menghasilkan Arus

Dengan Java 8, antarmuka Collection memiliki dua metode untuk menghasilkan Stream.

  • stream() - Mengembalikan aliran berurutan yang mempertimbangkan koleksi sebagai sumbernya.

  • parallelStream() - Mengembalikan Aliran paralel dengan mempertimbangkan koleksi sebagai sumbernya.

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

untuk setiap

Aliran telah menyediakan metode baru 'forEach' untuk mengulang setiap elemen aliran. Segmen kode berikut menunjukkan cara mencetak 10 nomor acak menggunakan forEach.

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

peta

Metode 'peta' digunakan untuk memetakan setiap elemen ke hasil yang sesuai. Segmen kode berikut mencetak kotak unik angka menggunakan peta.

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());

Saring

Metode 'filter' digunakan untuk menghilangkan elemen berdasarkan kriteria. Segmen kode berikut mencetak jumlah string kosong menggunakan filter.

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

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

membatasi

Metode 'batas' digunakan untuk mengurangi ukuran aliran. Segmen kode berikut menunjukkan cara mencetak 10 nomor acak menggunakan batas.

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

diurutkan

Metode 'diurutkan' digunakan untuk mengurutkan aliran. Segmen kode berikut menunjukkan cara mencetak 10 nomor acak dalam urutan yang diurutkan.

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

Proses paralel

parallelStream adalah alternatif aliran untuk pemrosesan paralel. Lihatlah segmen kode berikut yang mencetak jumlah string kosong menggunakan 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();

Sangat mudah untuk beralih antara aliran sekuensial dan paralel.

Kolektor

Kolektor digunakan untuk menggabungkan hasil pemrosesan pada elemen-elemen sungai. Kolektor dapat digunakan untuk mengembalikan daftar atau string.

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);

Statistik

Dengan Java 8, pengumpul statistik diperkenalkan untuk menghitung semua statistik saat pemrosesan streaming sedang dilakukan.

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());

Contoh Streaming

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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();
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan hasil sebagai berikut -

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

Opsional adalah objek kontainer yang digunakan untuk memuat objek bukan-null. Objek opsional digunakan untuk mewakili null dengan nilai yang tidak ada. Kelas ini memiliki berbagai metode utilitas untuk memfasilitasi kode untuk menangani nilai sebagai 'tersedia' atau 'tidak tersedia' alih-alih memeriksa nilai null. Ini diperkenalkan di Java 8 dan mirip dengan Opsional di Guava.

Deklarasi Kelas

Berikut adalah deklarasi untuk java.util.Optional<T> kelas -

public final class Optional<T> extends Object

Metode Kelas

Sr.No. Metode & Deskripsi
1

static <T> Optional<T> empty()

Mengembalikan contoh opsional kosong.

2

boolean equals(Object obj)

Menunjukkan apakah beberapa objek lain "sama dengan" Opsional ini.

3

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

Jika ada nilai dan nilainya cocok dengan predikat yang diberikan, ia mengembalikan Opsional yang mendeskripsikan nilai, jika tidak, mengembalikan Opsional kosong.

4

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

Jika ada nilai, itu menerapkan fungsi pemetaan bantalan Opsional yang disediakan padanya, mengembalikan hasil itu, jika tidak mengembalikan Opsional kosong.

5

T get()

Jika ada nilai dalam Opsional ini, kembalikan nilainya, jika tidak, akan muncul NoSuchElementException.

6

int hashCode()

Mengembalikan nilai kode hash dari nilai saat ini, jika ada, atau 0 (nol) jika tidak ada nilai.

7

void ifPresent(Consumer<? super T> consumer)

Jika ada nilai, itu memanggil konsumen yang ditentukan dengan nilai tersebut, jika tidak tidak apa-apa.

8

boolean isPresent()

Mengembalikan nilai benar jika ada nilai, jika tidak salah.

9

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

Jika ada nilai, terapkan fungsi pemetaan yang disediakan padanya, dan jika hasilnya bukan nol, kembalikan Opsional yang mendeskripsikan hasilnya.

10

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

Mengembalikan Opsional dengan nilai bukan-nol saat ini yang ditentukan.

11

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

Mengembalikan Opsional yang mendeskripsikan nilai yang ditentukan, jika bukan nol, jika tidak, mengembalikan Opsional kosong.

12

T orElse(T other)

Mengembalikan nilai jika ada, jika tidak mengembalikan lainnya.

13

T orElseGet(Supplier<? extends T> other)

Mengembalikan nilai jika ada, jika tidak memanggil lainnya dan mengembalikan hasil dari pemanggilan itu.

14

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

Mengembalikan nilai yang terkandung, jika ada, jika tidak melempar pengecualian untuk dibuat oleh pemasok yang disediakan.

15

String toString()

Mengembalikan representasi string tidak kosong dari Opsional ini yang cocok untuk debugging.

Kelas ini mewarisi metode dari kelas berikut -

  • java.lang.Object

Contoh Opsional

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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;
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan keluaran berikut -

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

Dengan Java 8, Nashorn, mesin javascript yang jauh lebih baik diperkenalkan, untuk menggantikan Rhino yang sudah ada. Nashorn memberikan kinerja 2 hingga 10 kali lebih baik, karena secara langsung mengkompilasi kode dalam memori dan meneruskan bytecode ke JVM. Nashorn menggunakan fitur dinamika panggilan, yang diperkenalkan di Java 7 untuk meningkatkan kinerja.

jjs

Untuk mesin Nashorn, JAVA 8 memperkenalkan alat baris perintah baru, jjs, untuk menjalankan kode javascript di konsol.

Menafsirkan File js

Buat dan simpan file sample.js di c: \> folder JAVA.

sample.js

print('Hello World!');

Buka konsol dan gunakan perintah berikut.

C:\JAVA>jjs sample.js

Ini akan menghasilkan keluaran sebagai berikut:

Hello World!

jjs dalam Mode Interaktif

Buka konsol dan gunakan perintah berikut.

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

Lulus Argumen

Buka konsol dan gunakan perintah berikut.

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

Memanggil JavaScript dari Java

Dengan menggunakan ScriptEngineManager, kode JavaScript dapat dipanggil dan diinterpretasikan di Java.

Contoh

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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());
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan hasil sebagai berikut -

Mahesh
12

Memanggil Java dari JavaScript

Contoh berikut menjelaskan cara mengimpor dan menggunakan kelas Java di skrip java.

Buat dan simpan sample.js di c: \> folder 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);

Buka konsol dan gunakan perintah berikut.

C:\JAVA>jjs sample.js

Ini harus menghasilkan keluaran berikut -

78952000000000000003.20

Dengan Java 8, API Tanggal-Waktu baru diperkenalkan untuk menutupi kelemahan API waktu-tanggal lama berikut.

  • Not thread safe- java.util.Date tidak aman untuk thread, oleh karena itu pengembang harus berurusan dengan masalah konkurensi saat menggunakan tanggal. API waktu-tanggal yang baru tidak dapat diubah dan tidak memiliki metode penyetel.

  • Poor design- Tanggal Default mulai dari 1900, bulan mulai dari 1, dan hari mulai dari 0, jadi tidak ada keseragaman. API lama memiliki metode yang kurang langsung untuk operasi tanggal. API baru menyediakan berbagai metode utilitas untuk operasi semacam itu.

  • Difficult time zone handling- Pengembang harus menulis banyak kode untuk menangani masalah zona waktu. API baru telah dikembangkan dengan mempertimbangkan desain khusus domain.

Java 8 memperkenalkan API tanggal-waktu baru di bawah paket java.time. Berikut adalah beberapa kelas penting yang diperkenalkan dalam paket java.time.

  • Local - API tanggal-waktu yang disederhanakan tanpa kerumitan penanganan zona waktu.

  • Zoned - API tanggal-waktu khusus untuk menangani berbagai zona waktu.

API Tanggal-Waktu Lokal

Kelas LocalDate / LocalTime dan LocalDateTime menyederhanakan pengembangan di mana zona waktu tidak diperlukan. Mari kita lihat mereka beraksi.

Buat program java berikut menggunakan editor pilihan Anda di, misalnya, 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);
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan keluaran berikut -

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

Zoned Date-Time API

API tanggal-waktu yang dikategorikan akan digunakan ketika zona waktu akan dipertimbangkan. Mari kita lihat mereka beraksi.

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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);
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan keluaran berikut -

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

Chrono Units Enum

java.time.temporal.ChronoUnit enum ditambahkan di Java 8 untuk menggantikan nilai integer yang digunakan di API lama untuk mewakili hari, bulan, dll. Mari kita lihat mereka beraksi.

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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);
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan hasil sebagai berikut -

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

Periode dan Durasi

Dengan Java 8, dua kelas khusus diperkenalkan untuk menangani perbedaan waktu.

  • Period - Ini berkaitan dengan jumlah waktu berdasarkan tanggal.

  • Duration - Ini berkaitan dengan jumlah waktu berdasarkan waktu.

Mari kita lihat mereka beraksi.

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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);
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan keluaran berikut -

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

Penyesuaian Temporal

TemporalAdjuster digunakan untuk melakukan matematika tanggal. Misalnya, dapatkan "Sabtu Kedua Setiap Bulan" atau "Selasa Depan". Mari kita lihat mereka beraksi.

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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);
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan hasil sebagai berikut -

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

Kompatibilitas terbalik

Metode toInstant () ditambahkan ke objek Tanggal dan Kalender asli, yang bisa digunakan untuk mengonversinya menjadi API Tanggal-Waktu yang baru. Gunakan metode ofInstant (Insant, ZoneId) untuk mendapatkan objek LocalDateTime atau ZonedDateTime. Mari kita lihat mereka beraksi.

Buat program Java berikut menggunakan editor pilihan Anda di, misalnya, 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);
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan keluaran berikut -

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]

Dengan Java 8, Base64 akhirnya mendapatkan haknya. Java 8 sekarang memiliki encoder dan decoder bawaan untuk encoding Base64. Di Java 8, kita dapat menggunakan tiga jenis pengkodean Base64.

  • Simple- Output dipetakan ke satu set karakter yang terletak di A-Za-z0-9 + /. Encoder tidak menambahkan feed baris apa pun dalam output, dan decoder menolak karakter apa pun selain A-Za-z0-9 + /.

  • URL- Output dipetakan ke set karakter yang terletak di A-Za-z0-9 + _. Outputnya adalah URL dan nama file yang aman.

  • MIME- Output dipetakan ke format ramah MIME. Output direpresentasikan dalam baris yang masing-masing tidak lebih dari 76 karakter, dan menggunakan carriage return '\ r' diikuti dengan linefeed '\ n' sebagai pemisah baris. Tidak ada pemisah baris di akhir keluaran yang dikodekan.

Kelas Bersarang

Sr.No. Kelas & Deskripsi bertingkat
1

static class Base64.Decoder

Kelas ini mengimplementasikan dekoder untuk mendekode data byte menggunakan skema pengkodean Base64 seperti yang ditentukan dalam RFC 4648 dan RFC 2045.

2

static class Base64.Encoder

Kelas ini mengimplementasikan encoder untuk encoding data byte menggunakan skema encoding Base64 seperti yang ditentukan dalam RFC 4648 dan RFC 2045.

Metode

Sr.No. Nama Metode & Deskripsi
1

static Base64.Decoder getDecoder()

Mengembalikan Base64.Decoder yang mendekode menggunakan skema pengkodean base64 tipe Dasar.

2

static Base64.Encoder getEncoder()

Mengembalikan Base64.Encoder yang menyandikan menggunakan skema penyandian base64 tipe Dasar.

3

static Base64.Decoder getMimeDecoder()

Mengembalikan Base64.Decoder yang mendekode menggunakan skema dekode base64 jenis MIME.

4

static Base64.Encoder getMimeEncoder()

Mengembalikan Base64.Encoder yang menyandikan menggunakan skema penyandian base64 jenis MIME.

5

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

Mengembalikan Base64.Encoder yang menyandikan menggunakan skema penyandian base64 jenis MIME dengan panjang baris dan pemisah baris yang ditentukan.

6

static Base64.Decoder getUrlDecoder()

Mengembalikan Base64.Decoder yang mendekode menggunakan URL dan nama file skema pengkodean base64 tipe aman.

7

static Base64.Encoder getUrlEncoder()

Mengembalikan Base64.Encoder yang menyandikan menggunakan URL dan nama file skema pengkodean base64 tipe aman.

Metode yang Diwarisi

Kelas ini mewarisi metode dari kelas berikut -

  • java.lang.Object

Contoh Base64

Buat program Java berikut menggunakan editor pilihan Anda, katakanlah 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());
      }
   }
}

Verifikasi Hasilnya

Kompilasi kelas menggunakan javac kompiler sebagai berikut -

C:\JAVA>javac Java8Tester.java

Sekarang jalankan Java8Tester sebagai berikut -

C:\JAVA>java Java8Tester

Ini harus menghasilkan keluaran berikut -

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