Java 9 - Panduan Cepat

JAVA 9 (alias jdk 1.9) adalah rilis utama pengembangan bahasa pemrograman JAVA. Versi awalnya dirilis pada 21 Sep 2017. Tujuan utama rilis Java 9 adalah -

  • Untuk membuat platform JDK dan Java Standard Edition menjadi modular dalam arti bahwa ia dapat diperkecil ke perangkat komputasi kecil dengan baik.

  • Untuk meningkatkan keamanan keseluruhan JDK dan Implementasi Java.

  • Untuk mempermudah proses pembangunan dan pemeliharaan pustaka kode java dan aplikasi besar untuk platform JAVA SE dan EE.

  • Untuk merancang dan mengimplementasikan sistem modul standar untuk Platform Java yang dapat diterapkan pada Platform dan JDK dengan mudah.

Fitur baru

Ada 90+ peningkatan yang ditambahkan ke Java 8, yang paling signifikan disebutkan di bawah -

  • Module - Jenis baru dari komponen pemrograman Java yang diperkenalkan sebagai modul, yang merupakan kumpulan kode dan data yang dinamai dan mendeskripsikan sendiri.

  • REPL (JShell) - Kemampuan Read-Eval-Print Loop (REPL) ditambahkan ke platform Java.

  • HTTP 2 Client - API HTTPClient baru yang mendukung websockets dan aliran HTTP 2 serta fitur server push.

  • Improved JavaDocs- Mendukung pembuatan output HTML5. Menyediakan kotak pencarian untuk menghasilkan dokumentasi API.

  • Multirelease JAR - Meningkatkan format JAR sehingga beberapa file kelas versi khusus rilis Java dapat hidup berdampingan dalam satu arsip.

  • Collection Factory Methods - Metode pabrik statis baru untuk antarmuka Daftar, Set, dan Peta untuk membuat contoh yang tidak dapat diubah dari koleksi tersebut.

  • Private Interface Methods - Antarmuka yang ditingkatkan dengan metode statis privat dan privat.

  • Process API Improvements - Peningkatan API untuk mengontrol dan mengelola proses sistem operasi.

  • Stream API Improvements - Keamanan dan ketahanan yang ditingkatkan dengan memungkinkan aliran masuk data serialisasi objek untuk difilter.

  • Try With Resources improvement - Sekarang variabel terakhir dapat digunakan sebagai sumber daya dalam pernyataan coba-dengan-sumber daya.

  • Enhanced @Deprecated Annotation - Anotasi @Deprecated diubah untuk memberikan lebih banyak informasi tentang status dan disposisi yang diinginkan dari API.

  • Inner Class Diamond Operator - Izinkan operator berlian untuk digunakan dengan kelas anonim jika tipe argumen dari tipe yang disimpulkan dapat dilambangkan.

  • Optional Class Improvements - Metode baru yang berguna ditambahkan ke kelas java.util.Optional.

  • Multiresolution Image API - Mendukung enkapsulasi sekumpulan gambar dengan resolusi berbeda menjadi satu gambar multiresolusi.

  • CompletableFuture API improvements - Mekanisme asinkron dari kelas CompletableFuture dapat melakukan tindakan ketika proses keluar dengan metode ProcessHandle.onExit.

  • Lightweight JSON - API ringan yang diperkenalkan untuk menggunakan dan menghasilkan dokumen dan aliran data melalui json di java 9.

  • Reactive Streams API - Reactive Streams API baru di Java SE 9 telah diperkenalkan untuk mendukung pemrograman reaktif di java 9.

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 tersedia untuk diunduh secara gratis. Untuk mengunduh klik di sini , silakan unduh versi yang kompatibel dengan 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, edit variabel 'Path' dan tambahkan path ke direktori Java yang dapat dieksekusi di akhirnya. Misalnya, jika jalur saat ini disetel ke C:\Windows\System32, edit dengan cara berikut

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 PATH = %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 file .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. Yang paling populer dijelaskan secara singkat di bawah ini -

  • Notepad- Pada mesin Windows, Anda dapat menggunakan editor teks sederhana seperti Notepad (disarankan untuk tutorial ini) atau WordPad. Notepad ++ juga merupakan editor teks gratis yang meningkatkan fasilitas.

  • Netbeans - Ini adalah IDE Java yang open-source dan gratis yang dapat diunduh dari https://www.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/.

IDE atau Integrated Development Environment, menyediakan semua alat dan fasilitas umum untuk membantu pemrograman, seperti editor kode sumber, alat pembuatan dan debugger, dll.

Java 9, jenis baru komponen pemrograman yang disebut modul telah diperkenalkan. Modul adalah kumpulan kode dan data yang mendeskripsikan diri sendiri dan memiliki nama untuk mengidentifikasinya.

fitur

Dengan komponen Modules, penyempurnaan berikut telah ditambahkan di Java 9 -

  • Fase opsional baru, waktu tautan, diperkenalkan. Fase ini berada di antara waktu kompilasi dan waktu proses. Selama fase ini, sekumpulan modul dapat dirakit dan dioptimalkan, membuat gambar runtime kustom menggunakan alat jlink.

  • javac, jlink, dan java memiliki opsi tambahan untuk menentukan jalur modul, yang selanjutnya menemukan definisi modul.

  • Format JAR diperbarui sebagai JAR modular, yang berisi file modul-info.class di direktori akarnya.

  • Format JMOD diperkenalkan, format kemasan (mirip dengan JAR) yang dapat menyertakan kode asli dan file konfigurasi.

Membuat Modul

Mengikuti langkah-langkah untuk membuat modul katakanlah com.tutorialspoint.greetings.

Langkah 1

Buat folder C: \> JAVA \ src. Sekarang buat folder com.tutorialspoint.greetings yang sama dengan nama modul yang kita buat.

Langkah 2

Buat module-info.java di folder C: \> JAVA \ src \ com.tutorialspoint.greetings dengan kode berikut.

module-info.java

module com.tutorialspoint.greetings { }

module-info.java adalah file yang digunakan untuk membuat modul. Pada langkah ini kami telah membuat modul bernama com.tutorialspoint.greetings. Sesuai ketentuan, file ini harus berada di folder yang namanya sama dengan nama modul.

LANGKAH 3

Tambahkan kode sumber di modul. Buat Java9Tester.java di folder C: \> JAVA \ src \ com.tutorialspoint.greetings \ com \ tutorialspoint \ greetings dengan kode berikut.

Java9Tester.java

package com.tutorialspoint.greetings;

public class Java9Tester {
   public static void main(String[] args) {
      System.out.println("Hello World!");
   }
}

Secara konvensi, kode sumber modul terletak di direktori yang sama yang merupakan nama modul.

LANGKAH 4

Buat folder C: \> JAVA \ mods. Sekarang buat folder com.tutorialspoint.greetings yang sama dengan nama modul yang telah kita buat. Sekarang kompilasi modul ke direktori mods.

C:/ > JAVA > javac -d mods/com.tutorialspoint.greetings 
   src/com.tutorialspoint.greetings/module-info.java 
   src/com.tutorialspoint.greetings/com/tutorialspoint/greetings/Java9Tester.java

LANGKAH 5

Mari kita jalankan modulnya untuk melihat hasilnya. Jalankan perintah berikut.

C:/ > JAVA > java --module-path mods -m com.tutorialspoint.greetings/com.tutorialspoint.greetings.Java9Tester

Di sini module-path menyediakan lokasi modul sebagai mods dan -m menandakan modul utama.

Keluaran

Ini akan mencetak output berikut di konsol.

Hello World!

REPL adalah singkatan dari Read-Eval-Print Loop. Dengan JShell, java memiliki kemampuan REPL. Dengan REPL, kita dapat membuat kode dan menguji logika berbasis java tanpa harus melakukan kompilasi menggunakan javac dan melihat langsung hasil perhitungannya.

Menjalankan JShell

Buka command prompt dan ketik jshell.

$ jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro
jshell>

Melihat perintah JShell

Ketik / bantuan setelah perintah jshell mulai berjalan.

jshell> /help
|  Type a Java language expression, statement, or declaration.
|  Or type one of the following commands:
|  /list [<name or id>|-all|-start]
|  list the source you have typed
|  /edit <name or id>
|  edit a source entry referenced by name or id
|  /drop <name or id>
|  delete a source entry referenced by name or id
|  /save [-all|-history|-start] <file>
|  Save snippet source to a file.
|  /open <file>
|  open a file as source input
|  /vars [<name or id>|-all|-start]
|  list the declared variables and their values
|  /methods [<name or id>|-all|-start]
|  list the declared methods and their signatures
|  /types [<name or id>|-all|-start]
|  list the declared types
|  /imports 
|  list the imported items

Menjalankan perintah JShell

Ketik / impor setelah perintah jshell mulai berjalan dan lihat impor yang digunakan.

jshell> /imports
|    import java.io.*
|    import java.math.*
|    import java.net.*
|    import java.nio.file.*
|    import java.util.*
|    import java.util.concurrent.*
|    import java.util.function.*
|    import java.util.prefs.*
|    import java.util.regex.*
|    import java.util.stream.*
jshell>

Menjalankan Perhitungan di JShell.

Coba jalankan penghitungan sederhana di JShell.

jshell> 3+1
$1 ==> 4 jshell> 13%7 $2 ==> 6
jshell> $2 $2 ==> 6
jshell>

Membuat dan menggunakan fungsi di JShell

Buat fungsi doubled () untuk mengambil int dan mengembalikan nilainya yang digandakan.

jshell> int doubled(int i){ return i*2;}
|  created method doubled(int)
jshell> doubled(6)
$3 ==> 12
jshell>

Keluar dari JShell

Ketik / keluar.

jshell> /exit
| Goodbye

Dokumentasi Java dapat dibuat menggunakan alat javadoc. Saat ini menghasilkan dokumentasi dalam format html 4.0. Di java 9, kita dapat membuat dokumentasi dalam format html 5 dengan menggunakan opsi -html5 dalam argumen baris perintah.

Dokumentasi java gaya lama

Perhatikan kode berikut di folder C: / JAVA.

Tester.java

/**
 * @author MahKumar
 * @version 0.1
 */
public class Tester {
   /**
   * Default method to be run to print 
   * <p>Hello world</p>
   * @param args command line arguments
   */
   public static void main(String []args) {
      System.out.println("Hello World");
   }
}

Sekarang jalankan alat javadoc jdk 7 untuk menghasilkan dokumentasi.

C:\JAVA>javadoc -d C:/JAVA Tester.java
Loading source file tester.java...
Constructing Javadoc information...
Standard Doclet version 1.7.0_21
Building tree for all the packages and classes...
Generating C:\JAVA\Tester.html...
Generating C:\JAVA\package-frame.html...
Generating C:\JAVA\package-summary.html...
Generating C:\JAVA\package-tree.html...
Generating C:\JAVA\constant-values.html...
Building index for all the packages and classes...
Generating C:\JAVA\overview-tree.html...
Generating C:\JAVA\index-all.html...
Generating C:\JAVA\deprecated-list.html...
Building index for all classes...
Generating C:\JAVA\allclasses-frame.html...
Generating C:\JAVA\allclasses-noframe.html...
Generating C:\JAVA\index.html...
Generating C:\JAVA\help-doc.html...

Ini akan membuat halaman dokumentasi java di direktori C: / JAVA dan Anda akan melihat output berikut.

Dokumentasi java baru dengan Penelusuran dan dukungan HTML5

Jalankan alat javadoc jdk 9 dengan tanda -html5 untuk menghasilkan jenis dokumentasi baru.

C:\JAVA> javadoc -d C:/JAVA -html5 Tester.java
Loading source file Tester.java...
Constructing Javadoc information...
Standard Doclet version 9.0.1
Building tree for all the packages and classes...
Generating C:\JAVA\Tester.html...
Generating C:\JAVA\package-frame.html...
Generating C:\JAVA\package-summary.html...
Generating C:\JAVA\package-tree.html...
Generating C:\JAVA\constant-values.html...
Building index for all the packages and classes...
Generating C:\JAVA\overview-tree.html...
Generating C:\JAVA\index-all.html...
Generating C:\JAVA\deprecated-list.html...
Building index for all classes...
Generating C:\JAVA\allclasses-frame.html...
Generating C:\JAVA\allclasses-frame.html...
Generating C:\JAVA\allclasses-noframe.html...
Generating C:\JAVA\allclasses-noframe.html...
Generating C:\JAVA\index.html...
Generating C:\JAVA\help-doc.html...

Ini akan membuat halaman dokumentasi java yang diperbarui di direktori D: / test dan Anda akan melihat output berikut.

Di java 9, fitur baru diperkenalkan di mana format jar telah ditingkatkan agar memiliki versi kelas java yang berbeda atau sumber daya dapat dipertahankan dan digunakan sesuai platform. Dalam JAR, file MANIFEST.MF file memiliki entri Multi-Release: true di bagian utamanya. Direktori META-INF juga berisi subdirektori versi yang subdirektorinya (dimulai dengan 9 untuk Java 9) menyimpan kelas khusus versi dan file sumber daya.

Dalam contoh ini, kami akan menggunakan jar multi-rilis untuk memiliki dua versi file Tester.java, satu untuk jdk 7 dan satu untuk jdk 9 dan menjalankannya pada versi jdk yang berbeda.

Langkah

Step 1- Buat folder c: / test / java7 / com / tutorialspoint. Buat Test.java dengan konten berikut -

Tester.java

package com.tutorialspoint;

public class Tester {
   public static void main(String[] args) {
      System.out.println("Inside java 7");
   }
}

Step 2- Buat folder c: / test / java9 / com / tutorialspoint. Buat Test.java dengan konten berikut -

Tester.java

package com.tutorialspoint;

public class Tester {
   public static void main(String[] args) {
      System.out.println("Inside java 9");
   }
}

Kompilasi kode sumber.

C:\test > javac --release 9 java9/com/tutorialspoint/Tester.java

C:\JAVA > javac --release 7 java7/com/tutorialspoint/Tester.java

Buat stoples multi-rilis

C:\JAVA > jar -c -f test.jar -C java7 . --release 9 -C java9.
Warning: entry META-INF/versions/9/com/tutorialspoint/Tester.java, 
   multiple resources with same name

Jalankan dengan JDK 7

C:\JAVA > java -cp test.jar com.tutorialspoint.Tester
Inside Java 7

Jalankan dengan JDK 9

C:\JAVA > java -cp test.jar com.tutorialspoint.Tester
Inside Java 9

Dengan Java 9, metode pabrik baru ditambahkan ke antarmuka Daftar, Setel, dan Peta untuk membuat instance yang tidak dapat diubah. Metode pabrik ini adalah metode pabrik praktis untuk membuat koleksi dengan cara yang lebih singkat dan ringkas.

Cara lama untuk membuat koleksi

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Tester {

   public static void main(String []args) {
      Set<String> set = new HashSet<>();
      set.add("A");
      set.add("B");
      set.add("C");
      set = Collections.unmodifiableSet(set);
      System.out.println(set);
      List<String> list = new ArrayList<>();

      list.add("A");
      list.add("B");
      list.add("C");
      list = Collections.unmodifiableList(list);
      System.out.println(list);
      Map<String, String> map = new HashMap<>();

      map.put("A","Apple");
      map.put("B","Boy");
      map.put("C","Cat");
      map = Collections.unmodifiableMap(map);
      System.out.println(map);
   }
}

Keluaran

Ini akan mencetak keluaran berikut.

[A, B, C]
[A, B, C]
{A=Apple, B=Boy, C=Cat}

Metode Baru

Dengan java 9, metode berikut ditambahkan ke antarmuka Daftar, Set, dan Peta bersama dengan rekan-rekan mereka yang kelebihan beban.

static <E> List<E> of(E e1, E e2, E e3);
static <E> Set<E>  of(E e1, E e2, E e3);
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3);
static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)

Poin yang Perlu Diperhatikan

  • Untuk antarmuka List dan Set, metode (...) kelebihan beban untuk memiliki 0 hingga 10 parameter dan satu dengan parameter var args.

  • Untuk antarmuka Peta, metode (...) dibebani untuk memiliki 0 hingga 10 parameter.

  • Dalam kasus lebih dari 10 parameter untuk antarmuka Map, metode ofEntries (...) dapat digunakan untuk menerima parameter var args.

Cara baru untuk membuat koleksi

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.AbstractMap;
import java.util.Map;
import java.util.Set;

public class Tester {

   public static void main(String []args) {
      Set<String> set = Set.of("A", "B", "C");      
      System.out.println(set);
      List<String> list = List.of("A", "B", "C");
      System.out.println(list);
      Map<String, String> map = Map.of("A","Apple","B","Boy","C","Cat");
      System.out.println(map);
  
      Map<String, String> map1 = Map.ofEntries (
         new AbstractMap.SimpleEntry<>("A","Apple"),
         new AbstractMap.SimpleEntry<>("B","Boy"),
         new AbstractMap.SimpleEntry<>("C","Cat"));
      System.out.println(map1);
   }
}

Keluaran

Ini akan mencetak keluaran berikut.

[A, B, C]
[A, B, C]
{A=Apple, B=Boy, C=Cat}
{A=Apple, B=Boy, C=Cat}

Sebelum java 8, antarmuka dapat memiliki tipe variabel / metode berikut.

  • Variabel konstan
  • Metode abstrak

Jadi kita tidak bisa memiliki implementasi metode dalam antarmuka atau lebih tepatnya implementasi default sebelum Java 8. Lihat contoh.

public class Tester {
   public static void main(String []args) {
      LogOracle log = new LogOracle();
      log.logInfo("");
      log.logWarn("");
      log.logError("");
      log.logFatal("");
      LogMySql log1 = new LogMySql();
      log1.logInfo("");
      log1.logWarn("");
      log1.logError("");
      log1.logFatal("");
   }
}

final class LogOracle implements Logging {
   @Override
   public void logInfo(String message) {
      getConnection();
      System.out.println("Log Message : " + "INFO");
      closeConnection();
   }

   @Override
   public void logWarn(String message) {
      getConnection();
      System.out.println("Log Message : " + "WARN");
      closeConnection();
   }

   @Override
   public void logError(String message) {
      getConnection();
      System.out.println("Log Message : " + "ERROR");
      closeConnection();
   }

   @Override
   public void logFatal(String message) {
      getConnection();
      System.out.println("Log Message : " + "FATAL");
      closeConnection();
   }

   @Override
   public void getConnection() {
      System.out.println("Open Database connection");
   }

   @Override
   public void closeConnection() {
      System.out.println("Close Database connection");
   }
}

final class LogMySql implements Logging {
   @Override
   public void logInfo(String message) {
      getConnection();
      System.out.println("Log Message : " + "INFO");
      closeConnection();
   }

   @Override
   public void logWarn(String message) {
      getConnection();
      System.out.println("Log Message : " + "WARN");
      closeConnection();
   }

   @Override
   public void logError(String message) {
      getConnection();
      System.out.println("Log Message : " + "ERROR");
      closeConnection();
   }

   @Override
   public void logFatal(String message) {
      getConnection();
      System.out.println("Log Message : " + "FATAL");
      closeConnection();
   }

   @Override
   public void getConnection() {
      System.out.println("Open Database connection");
   }

   @Override
   public void closeConnection() {
      System.out.println("Close Database connection");
   }
}

interface Logging {
   String ORACLE = "Oracle_Database";
   String MYSQL = "MySql_Database";

   void logInfo(String message);
   void logWarn(String message);
   void logError(String message);
   void logFatal(String message);

   void getConnection();
   void closeConnection();
}

Keluaran

Anda akan melihat output berikut.

Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection

Dalam contoh di atas, setiap metode log memiliki implementasinya sendiri. Dengan antarmuka Java 8 dapat memiliki jenis variabel / metode berikut.

  • Variabel konstan
  • Metode abstrak
  • Metode default
  • Metode statis

Mari kita memiliki implementasi default dan metode statis di antarmuka itu sendiri menggunakan Java 8.

public class Tester {
   public static void main(String []args) {
      LogOracle log = new LogOracle();
      log.logInfo("");
      log.logWarn("");
      log.logError("");
      log.logFatal("");
      LogMySql log1 = new LogMySql();
      log1.logInfo("");
      log1.logWarn("");
      log1.logError("");
      log1.logFatal("");
   }
}

final class LogOracle implements Logging { 
}

final class LogMySql implements Logging { 
}

interface Logging {
   String ORACLE = "Oracle_Database";
   String MYSQL = "MySql_Database";

   default void logInfo(String message) {
      getConnection();
      System.out.println("Log Message : " + "INFO");
      closeConnection();
   }
   
   default void logWarn(String message) {
      getConnection();
      System.out.println("Log Message : " + "WARN");
      closeConnection();
   }
   
   default void logError(String message) {
      getConnection();
      System.out.println("Log Message : " + "ERROR");
      closeConnection();
   }
   
   default void logFatal(String message) {
      getConnection();
      System.out.println("Log Message : " + "FATAL");
      closeConnection();
   }

   static void getConnection() {
      System.out.println("Open Database connection");
   }
   static void closeConnection() {
      System.out.println("Close Database connection");
   }
}

Keluaran

Anda akan melihat output berikut.

Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection

Dalam contoh di atas, kami mengalami pengulangan lagi. Dengan antarmuka Java 9 dapat memiliki tipe variabel / metode berikut.

  • Variabel konstan
  • Metode abstrak
  • Metode default
  • Metode statis
  • Metode pribadi
  • Metode Private Static

Mari kita memiliki metode pribadi dan menggunakannya di Java 9.

public class Tester {
   public static void main(String []args) {
      LogOracle log = new LogOracle();
      log.logInfo("");
      log.logWarn("");
      log.logError("");
      log.logFatal("");
      LogMySql log1 = new LogMySql();
      log1.logInfo("");
      log1.logWarn("");
      log1.logError("");
      log1.logFatal("");
   }
}

final class LogOracle implements Logging { 
}

final class LogMySql implements Logging { 
}

interface Logging {
   String ORACLE = "Oracle_Database";
   String MYSQL = "MySql_Database";

   private void log(String message, String prefix) {
      getConnection();
      System.out.println("Log Message : " + prefix);
      closeConnection();
   }
   
   default void logInfo(String message) {
      log(message, "INFO");
   }
   
   default void logWarn(String message) {
      log(message, "WARN");
   }
   
   default void logError(String message) {
      log(message, "ERROR");
   }
   
   default void logFatal(String message) {
      log(message, "FATAL");
   }

   private static void getConnection() {
      System.out.println("Open Database connection");
   }
   
   private static void closeConnection() {
      System.out.println("Close Database connection");
   }
}

Keluaran

Anda akan melihat output berikut.

Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection

Di Java 9 Process API yang bertanggung jawab untuk mengontrol dan mengelola proses sistem operasi telah meningkat pesat. ProcessHandle Class sekarang menyediakan proses ID asli proses, waktu mulai, akumulasi waktu CPU, argumen, perintah, pengguna, proses induk, dan turunan. Kelas ProcessHandle juga menyediakan metode untuk memeriksa keaktifan proses dan untuk menghancurkan proses. Ini memiliki metode onExit, kelas CompletableFuture dapat melakukan tindakan secara asinkron ketika proses keluar.

Tester.java

import java.time.ZoneId;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.io.IOException;

public class Tester {
   public static void main(String[] args) throws IOException {
      ProcessBuilder pb = new ProcessBuilder("notepad.exe");
      String np = "Not Present";
      Process p = pb.start();
      ProcessHandle.Info info = p.info();
      System.out.printf("Process ID : %s%n", p.pid());
      System.out.printf("Command name : %s%n", info.command().orElse(np));
      System.out.printf("Command line : %s%n", info.commandLine().orElse(np));

      System.out.printf("Start time: %s%n",
         info.startInstant().map(i -> i.atZone(ZoneId.systemDefault())
         .toLocalDateTime().toString()).orElse(np));

      System.out.printf("Arguments : %s%n",
         info.arguments().map(a -> Stream.of(a).collect(
            Collectors.joining(" "))).orElse(np));

      System.out.printf("User : %s%n", info.user().orElse(np));
   } 
}

Keluaran

Anda akan melihat output berikut.

Process ID : 5800
Command name : C:\Windows\System32\notepad.exe
Command line : Not Present
Start time: 2017-11-04T21:35:03.626
Arguments : Not Present
User: administrator

Streams diperkenalkan di Java untuk membantu developer melakukan operasi agregat dari serangkaian objek. Dengan Java 9, beberapa metode lagi ditambahkan untuk membuat streaming lebih baik.

takeWhile (Antarmuka Predikat)

Sintaksis

default Stream<T> takeWhile(Predicate<? super T> predicate)

Metode takeWhile mengambil semua nilai sampai predikat mengembalikan false. Ia mengembalikan, dalam kasus aliran terurut, aliran yang terdiri dari prefiks terpanjang elemen yang diambil dari aliran ini cocok dengan predikat yang diberikan.

Contoh

import java.util.stream.Stream;

public class Tester {
   public static void main(String[] args) {
      Stream.of("a","b","c","","e","f").takeWhile(s->!s.isEmpty())
         .forEach(System.out::print);		 
   } 
}

Keluaran

Metode takeWhile mengambil semua nilai a, b, dan c, lalu setelah string kosong, ia berhenti dijalankan.

abc

dropWhile (Antarmuka Predikat)

Sintaksis

default Stream<T> dropWhile(Predicate<? super T> predicate)

dropWhile metode membuang semua nilai di awal sampai predikat mengembalikan true. Ini mengembalikan, dalam kasus aliran terurut, aliran yang terdiri dari elemen yang tersisa dari aliran ini setelah menjatuhkan awalan terpanjang dari elemen yang cocok dengan predikat yang diberikan.

Contoh

import java.util.stream.Stream;

public class Tester {
   public static void main(String[] args) {
      Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty())
      .forEach(System.out::print);
      System.out.println();
      Stream.of("a","b","c","","e","","f").dropWhile(s-> !s.isEmpty())
      .forEach(System.out::print);
   } 
}

Keluaran

dropWhile metode menjatuhkan nilai a, b dan c, maka setelah string kosong, ia mengambil semua nilai.

ef
ef

pengulangan

Sintaksis

static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)

metode iterate sekarang memiliki predikat hasNext sebagai parameter yang menghentikan loop setelah predikat hasNext mengembalikan false.

Contoh

import java.util.stream.IntStream;

public class Tester {
   public static void main(String[] args) {
      IntStream.iterate(3, x -> x < 10, x -> x+ 3).forEach(System.out::println);
   } 
}

Keluaran

3
6
9

ofNullable

Sintaksis

static <T> Stream<T> ofNullable(T t)

Metode ofNullable diperkenalkan untuk mencegah NullPointerExceptions dan untuk menghindari pemeriksaan null untuk streaming. Metode ini mengembalikan Stream berurutan yang berisi elemen tunggal, jika bukan null, jika tidak mengembalikan Stream kosong.

Contoh

import java.util.stream.Stream;

public class Tester {
   public static void main(String[] args) {
      long count = Stream.ofNullable(100).count();
      System.out.println(count);
  
      count = Stream.ofNullable(null).count();
      System.out.println(count);
   } 
}

Keluaran

1
0

Pernyataan coba-dengan-sumber daya adalah pernyataan percobaan dengan satu atau lebih sumber daya yang benar-benar dideklarasikan. Di sini resource adalah objek yang harus ditutup setelah tidak diperlukan lagi. Pernyataan coba-dengan-sumber daya memastikan bahwa setiap sumber daya ditutup setelah persyaratan selesai. Objek apa pun yang mengimplementasikan antarmuka java.lang.AutoCloseable atau java.io.Closeable, dapat digunakan sebagai sumber daya.

Sebelum Java 9, sumber daya harus dideklarasikan sebelum pernyataan try atau inside try seperti yang ditunjukkan di bawah ini dalam contoh yang diberikan. Dalam contoh ini, kita akan menggunakan BufferedReader sebagai sumber daya untuk membaca string dan kemudian BufferedReader akan ditutup.

Tester.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Tester {
   public static void main(String[] args) throws IOException {
      System.out.println(readData("test"));
   } 

   static String readData(String message) throws IOException {
      Reader inputString = new StringReader(message);
      BufferedReader br = new BufferedReader(inputString);
      try (BufferedReader br1 = br) {
         return br1.readLine();
      }
   }
}

Keluaran

test

Di sini kita perlu mendeklarasikan resource br1 dalam status try dan kemudian menggunakannya. Di Java9, kita tidak perlu mendeklarasikan br1 lagi dan program berikut akan memberikan hasil yang sama.

Tester.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Tester {
   public static void main(String[] args) throws IOException {
      System.out.println(readData("test"));
   } 

   static String readData(String message) throws IOException {
      Reader inputString = new StringReader(message);
      BufferedReader br = new BufferedReader(inputString);
      try (br) {
         return br.readLine();
      }
   }
}

Keluaran

test

Anotasi @Deprecated diperkenalkan di java 5 versi. Elemen program yang dianotasi dengan @Deprecated berarti itu tidak boleh digunakan karena salah satu alasan berikut -

  • Penggunaannya dapat menyebabkan kesalahan.
  • Ini mungkin tidak kompatibel dalam versi mendatang.
  • Ini mungkin dihapus di versi mendatang.
  • Alternatif yang lebih baik dan efisien telah menggantikannya.

Compiler menghasilkan peringatan setiap kali elemen yang tidak digunakan lagi digunakan. Dengan Java 9, dua penyempurnaan baru dibuat untuk anotasi @Deprecated.

  • forRemoval- Menunjukkan apakah elemen beranotasi dapat dihapus di versi mendatang. Nilai defaultnya salah.

  • since- Mengembalikan versi di mana elemen beranotasi tidak digunakan lagi. Nilai defaultnya adalah string kosong.

Tidak digunakan lagi sejak

Contoh kelas Boolean javadoc di Java 9 mengilustrasikan penggunaan atribut sejak pada anotasi @Deprecated.

Kelas Boolean

Tidak digunakan lagi dengan forRemoval

Contoh class sistem javadoc di Java 9 mengilustrasikan penggunaan atribut forRemoval pada anotasi @Deprecated.

Kelas Sistem

Operator Diamond diperkenalkan di java 7 untuk membuat kode lebih mudah dibaca tetapi tidak dapat digunakan dengan kelas dalam Anonymous. Di java 9, ini dapat digunakan dengan kelas annonymous juga untuk menyederhanakan kode dan meningkatkan keterbacaan. Pertimbangkan kode berikut sebelum Java 9.

Tester.java

public class Tester {
   public static void main(String[] args) {
         Handler<Integer> intHandler = new Handler<Integer>(1) {
         
         @Override
         public void handle() {
            System.out.println(content);
         }
      };

      intHandler.handle();
      Handler<? extends Number> intHandler1 = new Handler<Number>(2) {
         
         @Override
         public void handle() {
            System.out.println(content);
         }
      };

      intHandler1.handle();
      Handler<?> handler = new Handler<Object>("test") {
         
         @Override
         public void handle() {
            System.out.println(content);
         }
      };

      handler.handle();    
   }  
}

abstract class Handler<T> {
   public T content;

   public Handler(T content) {
      this.content = content; 
   }
   
   abstract void handle();
}

Keluaran

1
2
Test

Dengan Java 9, kita dapat menggunakan operator <> dengan kelas anonim seperti yang ditunjukkan di bawah ini.

Tester.java

public class Tester {
   public static void main(String[] args) {
         Handler<Integer> intHandler = new Handler<>(1) {
         
         @Override
         public void handle() {
            System.out.println(content);
         }
      };

      intHandler.handle();
      Handler<? extends Number> intHandler1 = new Handler<>(2) {
         
         @Override
         public void handle() {
            System.out.println(content);
         }
      };

      intHandler1.handle();
      Handler<?> handler = new Handler<>("test") {
         
         @Override
         public void handle() {
            System.out.println(content);
         }
      };

      handler.handle();    
   }  
}

abstract class Handler<T> {
   public T content;

   public Handler(T content) {
      this.content = content; 
   }
   
   abstract void handle();
}

Keluaran

1
2
Test

Kelas Opsional diperkenalkan di Java 8 untuk menghindari pemeriksaan null dan masalah NullPointerException. Di java 9, tiga metode baru ditambahkan untuk meningkatkan fungsinya.

  • stream()
  • ifPresentOrElse()
  • or()

stream ()

Sintaksis

public Stream<T> stream()

Jika ada nilai, ia mengembalikan Stream berurutan yang hanya berisi nilai itu, jika tidak mengembalikan Stream kosong.

Contoh

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Tester {
public static void main(String[] args) {
   List<Optional<String>> list = Arrays.asList (
      Optional.empty(), 
      Optional.of("A"), 
      Optional.empty(), 
      Optional.of("B"));

   //filter the list based to print non-empty values
  
   //if optional is non-empty, get the value in stream, otherwise return empty
   List<String> filteredList = list.stream()
      .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
      .collect(Collectors.toList());

   //Optional::stream method will return a stream of either one 
   //or zero element if data is present or not.
   List<String> filteredListJava9 = list.stream()
      .flatMap(Optional::stream)
      .collect(Collectors.toList());

      System.out.println(filteredList);
      System.out.println(filteredListJava9);
   }  
}

Keluaran

[A, B]
[A, B]

ifPresentOrElse ()

Sintaksis

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

Jika ada nilai, lakukan tindakan tertentu dengan nilai tersebut, jika tidak, lakukan tindakan berbasis kosong yang diberikan.

Contoh

import java.util.Optional;

public class Tester {
   public static void main(String[] args) {
      Optional<Integer> optional = Optional.of(1);

      optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() -> 
         System.out.println("Not Present."));

      optional = Optional.empty();

      optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() -> 
         System.out.println("Not Present."));
   }  
}

Keluaran

Value: 1
Not Present.

atau () metode

Sintaksis

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

Jika ada nilai, kembalikan Opsional yang mendeskripsikan nilai, jika tidak, kembalikan Opsional yang dihasilkan oleh fungsi pemasok.

Contoh

import java.util.Optional;
import java.util.function.Supplier;

public class Tester {
   public static void main(String[] args) {
      Optional<String> optional1 = Optional.of("Mahesh");

      Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present");

      optional1 = optional1.or( supplierString);
  
      optional1.ifPresent( x -> System.out.println("Value: " + x));
    
      optional1 = Optional.empty();    

      optional1 = optional1.or( supplierString);
  
      optional1.ifPresent( x -> System.out.println("Value: " + x));  
   }  
}

Keluaran

Value: Mahesh
Value: Not Present

Dengan Java 9, API gambar multi-resolusi baru telah diperkenalkan yang mendukung banyak gambar dengan varian resolusi yang berbeda. API ini memungkinkan sekumpulan gambar dengan resolusi berbeda untuk digunakan sebagai gambar multi-resolusi tunggal. Berikut adalah operasi utama dari gambar multi-resolusi.

  • Image getResolutionVariant(double destImageWidth, double destImageHeight) - Mendapat gambar tertentu yang merupakan varian terbaik untuk mewakili gambar logis ini pada ukuran yang ditunjukkan.

  • List<Image> getResolutionVariants() - Mendapat daftar semua varian resolusi yang dapat dibaca.

Contoh

import java.io.IOException;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.awt.Image;
import java.awt.image.MultiResolutionImage;
import java.awt.image.BaseMultiResolutionImage;

import javax.imageio.ImageIO;

public class Tester {
   public static void main(String[] args) throws IOException, MalformedURLException {

      List<String> imgUrls = List.of("http://www.tutorialspoint.com/java9/images/logo.png",
         "http://www.tutorialspoint.com/java9/images/mini_logo.png",
         "http://www.tutorialspoint.com/java9/images/large_logo.png");

      List<Image> images = new ArrayList<Image>();

      for (String url : imgUrls) {
         images.add(ImageIO.read(new URL(url)));
      }

      // read all images into one multiresolution image
      MultiResolutionImage multiResolutionImage = 
         new BaseMultiResolutionImage(images.toArray(new Image[0]));

      // get all variants of images
      List<Image> variants = multiResolutionImage.getResolutionVariants();

      System.out.println("Total number of images: " + variants.size());

      for (Image img : variants) {
         System.out.println(img);
      }

      // get a resolution-specific image variant for each indicated size
      Image variant1 = multiResolutionImage.getResolutionVariant(156, 45);
      System.out.printf("\nImage for destination[%d,%d]: [%d,%d]", 
         156, 45, variant1.getWidth(null), variant1.getHeight(null));

      Image variant2 = multiResolutionImage.getResolutionVariant(311, 89);
      System.out.printf("\nImage for destination[%d,%d]: [%d,%d]", 311, 89, 
         variant2.getWidth(null), variant2.getHeight(null));

      Image variant3 = multiResolutionImage.getResolutionVariant(622, 178);
      System.out.printf("\nImage for destination[%d,%d]: [%d,%d]", 622, 178, 
         variant3.getWidth(null), variant3.getHeight(null));

      Image variant4 = multiResolutionImage.getResolutionVariant(300, 300);
      System.out.printf("\nImage for destination[%d,%d]: [%d,%d]", 300, 300, 
         variant4.getWidth(null), variant4.getHeight(null));
   }  
}

Keluaran

Total number of images: 3
BufferedImage@7ce6a65d: type = 6 ColorModel: #pixelBits = 32 numComponents = 4 
color space =java.awt.color.ICC_ColorSpace@548ad73b transparency = 3 
has alpha = true isAlphaPre = false ByteInterleavedRaster: width =311 
height = 89 #numDataElements 4 dataOff[0] = 3

BufferedImage@4c762604: type = 6 ColorModel: #pixelBits = 32 numComponents = 4 
color space =java.awt.color.ICC_ColorSpace@548ad73b transparency = 3 
has alpha = true isAlphaPre = false ByteInterleavedRaster: width =156 
height = 45 #numDataElements 4 dataOff[0] = 3

BufferedImage@2641e737: type = 6 ColorModel: #pixelBits = 32 numComponents = 4 
color space =java.awt.color.ICC_ColorSpace@548ad73b transparency = 3 
has alpha = true isAlphaPre = false ByteInterleavedRaster: width =622 
height = 178 #numDataElements 4 dataOff[0] = 3

Image for destination[156,45]: [311,89]
Image for destination[311,89]: [311,89]
Image for destination[622,178]: [622,178]
Image for destination[300,300]: [622,178]

Kelas CompletableFuture diperkenalkan di Java 8 untuk mewakili Masa Depan yang dapat diselesaikan dengan mengatur nilai dan statusnya secara jelas. Ini dapat digunakan sebagai java.util.concurrent.CompletionStage. Ini mendukung fungsi dan tindakan dependen yang dipicu setelah penyelesaian di masa depan. Di java 9 CompletableFuture API telah ditingkatkan lebih jauh. Berikut ini adalah perubahan relevan yang dilakukan pada API.

  • Dukungan untuk penundaan dan batas waktu.
  • Peningkatan dukungan untuk subclass.
  • Metode pabrik baru ditambahkan.

Dukungan untuk penundaan dan batas waktu

public CompletableFuture<T> completeOnTimeout(T value, long timeout, TimeUnit unit)

Metode ini menyelesaikan CompletableFuture ini dengan nilai yang diberikan jika tidak diselesaikan sebelum waktu tunggu yang ditentukan.

public CompletableFuture<T> orTimeout(long timeout, TimeUnit unit)

Metode ini secara luar biasa menyelesaikan CompletableFuture ini dengan TimeoutException jika tidak diselesaikan sebelum waktu tunggu tertentu.

Peningkatan dukungan untuk subclass

public Executor defaultExecutor()

Ini mengembalikan Pelaksana default yang digunakan untuk metode asinkron yang tidak menentukan Pelaksana. Metode ini dapat diganti dalam subclass untuk mengembalikan Executor untuk menyediakan minimal satu thread independen.

public <U> CompletableFuture<U> newIncompleteFuture()

Mengembalikan jenis CompletableFuture tidak lengkap baru yang akan dikembalikan oleh metode CompletionStage. Subclass dari kelas CompletableFuture harus mengganti metode ini untuk mengembalikan instance dari kelas yang sama dengan CompletableFuture ini. Implementasi default menampilkan instance kelas CompletableFuture.

Metode Pabrik Baru

public static <U> CompletableFuture<U> completedFuture(U value)

Metode pabrik ini mengembalikan CompletableFuture baru yang sudah diselesaikan dengan nilai yang diberikan.

public static <U> CompletionStage<U> completedStage(U value)

Metode pabrik ini mengembalikan CompletionStage baru yang sudah selesai dengan nilai yang diberikan dan hanya mendukung metode yang ada di antarmuka CompletionStage.

public static <U> CompletionStage<U> failedStage(Throwable ex)

Metode pabrik ini mengembalikan CompletionStage baru yang telah diselesaikan secara luar biasa dengan pengecualian yang diberikan dan hanya mendukung metode yang ada di antarmuka CompletionStage.

Terlepas dari fitur yang disebutkan, dengan Java 9, lebih banyak peningkatan dilakukan pada platform JDK. beberapa dari mereka terdaftar di bawah ini.

  • Perbaikan GC (Pengumpul Sampah)
  • Stack-Walking API
  • Filter Data Serialisasi Masuk
  • Hentikan API Applet
  • Tunjukkan Penggabungan String
  • Penanganan Metode yang Ditingkatkan
  • Layanan dan API Pencatatan Platform Java
  • String Kompak
  • Parser API untuk Nashorn