Java 8 - Hızlı Kılavuz

JAVA 8, JAVA programlama dili geliştirmenin önemli bir özellik sürümüdür. İlk sürümü 18 Mart 2014'te yayınlandı. Java 8 sürümü ile Java, işlevsel programlama, yeni JavaScript motoru, tarih saati manipülasyonu için yeni API'ler, yeni akış API'si vb. İçin destekler sağladı.

Yeni özellikler

  • Lambda expression - Java'ya işlevsel işleme yeteneği ekler.

  • Method references- İşlevleri doğrudan çağırmak yerine isimleriyle gönderme. Fonksiyonları parametre olarak kullanma.

  • Default method - Varsayılan yöntem uygulamasına sahip arayüz.

  • New tools - Bağımlılıkları anlamak için 'jdeps' gibi yeni derleyici araçları ve yardımcı programları eklendi.

  • Stream API - Ardışık düzen işlemeyi kolaylaştırmak için yeni akış API'si.

  • Date Time API - Geliştirilmiş tarih ve saat API'si.

  • Optional - Boş değerleri doğru şekilde ele almak için en iyi uygulamalara vurgu.

  • Nashorn, JavaScript Engine - JavaScript kodunu yürütmek için Java tabanlı bir motor.

Aşağıdaki kod parçacığını düşünün.

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

Aşağıdaki sonucu almak için programı çalıştırın.

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

İşte sortUsingJava8() yöntemi, sıralama ölçütlerini almak için parametre olarak lambda ifadesine sahip sıralama işlevini kullanır.

Yerel Ortam Kurulumu

Java programlama dili için kendi ortamınızı kurmak istiyorsanız, bu bölüm tüm süreç boyunca size yol gösterir. Java ortamınızı kurmak için lütfen aşağıda verilen adımları izleyin.

Java SE aşağıdaki bağlantıdan ücretsiz olarak indirilebilir -

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

İşletim sisteminize göre bir sürüm indirirsiniz.

Java'yı indirmek için talimatları izleyin ve .exeMakinenize Java yüklemek için. Java'yı makinenize yükledikten sonra, ortam değişkenlerini doğru yükleme dizinlerini gösterecek şekilde ayarlamanız gerekir.

Windows 2000 / XP için Yolu Ayarlama

Java'yı c: \ Program Files \ java \ jdk dizinine kurduğunuzu varsayarsak -

  • "Bilgisayarım" ı sağ tıklayın ve "Özellikler" i seçin.

  • "Gelişmiş" sekmesinin altındaki "Ortam değişkenleri" düğmesini tıklayın.

  • Şimdi, 'Yol' değişkenini, Java yürütülebilir dosyasının yolunu da içerecek şekilde değiştirin. Örneğin, yol şu anda 'C: \ WINDOWS \ SYSTEM32' olarak ayarlanmışsa, yolunuzu 'C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin' olarak değiştirin.

Windows 95/98 / ME için Yolu Ayarlama

Java'yı c: \ Program Files \ java \ jdk dizinine kurduğunuzu varsayarsak -

  • 'C: \ autoexec.bat' dosyasını düzenleyin ve sonuna aşağıdaki satırı ekleyin -

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

Linux, UNIX, Solaris, FreeBSD için Yol Ayarlama

PATH ortam değişkeni, Java ikili dosyalarının kurulu olduğu yeri gösterecek şekilde ayarlanmalıdır. Bunu yapmakta sorun yaşıyorsanız, kabuk belgelerinize bakın.

Örneğin, kabuğunuz olarak bash kullanırsanız, '.bashrc: export PATH = / path / to / java: $ PATH'in sonuna aşağıdaki satırı eklersiniz.

Popüler Java Editörleri

Java programları yazmak için bir metin düzenleyiciye ihtiyacınız var. Piyasada daha da karmaşık IDE'ler mevcuttur. Ancak şimdilik aşağıdakilerden birini düşünebilirsiniz -

  • Notepad - Windows makinesinde, Not Defteri (bu eğitim için önerilir) veya TextPad gibi herhangi bir basit metin düzenleyiciyi kullanabilirsiniz.

  • Netbeans- Açık kaynak kodlu ve ücretsiz bir Java IDE'dir. Adresinden indirilebilirhttps://netbeans.org/index.html.

  • Eclipse - Ayrıca Eclipse açık kaynak topluluğu tarafından geliştirilen bir Java IDE'dir ve şu adresten indirilebilir: https://www.eclipse.org/.

Lambda ifadeleri Java 8'de tanıtılır ve Java 8'in en büyük özelliği olarak lanse edilir. Lambda ifadesi, işlevsel programlamayı kolaylaştırır ve geliştirmeyi çok kolaylaştırır.

Sözdizimi

Bir lambda ifadesi aşağıdaki sözdizimi ile karakterize edilir.

parameter -> expression body

Aşağıda bir lambda ifadesinin önemli özellikleri verilmiştir.

  • Optional type declaration- Bir parametrenin türünü bildirmeye gerek yoktur. Derleyici, parametrenin değerinden aynı sonuca varabilir.

  • Optional parenthesis around parameter- Parantez içinde tek bir parametre belirtmeye gerek yoktur. Birden çok parametre için parantez gereklidir.

  • Optional curly braces - Gövde tek bir ifade içeriyorsa, ifade gövdesinde kaşlı ayraç kullanmaya gerek yoktur.

  • Optional return keyword- Gövdenin değeri döndürmek için tek bir ifadesi varsa, derleyici otomatik olarak değeri döndürür. İfadenin bir değer döndürdüğünü göstermek için kaşlı ayraçlar gereklidir.

Lambda İfadeleri Örneği

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki çıktıyı üretmelidir -

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

Yukarıdaki örnekte dikkate alınması gereken önemli noktalar aşağıdadır.

  • Lambda ifadeleri, öncelikle bir işlevsel arabirimin, yani yalnızca tek bir yöntemle bir arabirimin satır içi uygulamasını tanımlamak için kullanılır. Yukarıdaki örnekte, MathOperation arayüzünün işlem yöntemini tanımlamak için çeşitli lambda ifadeleri kullandık. Daha sonra, TebrikService'in sayMessage uygulamasını tanımladık.

  • Lambda ifadesi, anonim sınıf ihtiyacını ortadan kaldırır ve Java'ya çok basit ama güçlü bir işlevsel programlama yeteneği verir.

Dürbün

Lambda ifadesini kullanarak, herhangi bir son değişkene veya etkili bir son değişkene (yalnızca bir kez atanan) başvurabilirsiniz. Bir değişkene ikinci kez bir değer atanırsa, Lambda ifadesi bir derleme hatası atar.

Kapsam Örneği

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki çıktıyı üretmelidir -

Hello! Mahesh

Yöntem referansları, yöntemlere adlarıyla işaret etmeye yardımcı olur. Bir yöntem referansı "::" sembolü kullanılarak açıklanır. Aşağıdaki yöntem türlerini belirtmek için bir yöntem referansı kullanılabilir -

  • Statik yöntemler
  • Örnek yöntemleri
  • Yeni işleç kullanan kurucular (TreeSet :: new)

Yöntem Referans Örneği

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Burada System.out :: println yöntemini statik bir yöntem başvurusu olarak geçtik.

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki çıktıyı üretmelidir -

Mahesh
Suresh
Ramesh
Naresh
Kalpesh

Fonksiyonel arayüzlerin sergilenecek tek bir işlevi vardır. Örneğin, karşılaştırma amacıyla tek bir yöntem olan 'CompareTo' ile Karşılaştırılabilir bir arayüz kullanılır. Java 8, lambda ifadelerinde yaygın olarak kullanılacak birçok işlevsel arabirim tanımlamıştır. Aşağıda java.util.Function paketinde tanımlanan işlevsel arabirimlerin listesi yer almaktadır.

Sr.No. Arayüz ve Açıklama
1

BiConsumer<T,U>

İki giriş bağımsız değişkenini kabul eden ve sonuç döndürmeyen bir işlemi temsil eder.

2

BiFunction<T,U,R>

İki bağımsız değişkeni kabul eden ve bir sonuç üreten bir işlevi temsil eder.

3

BinaryOperator<T>

İşlenenlerle aynı türde bir sonuç üreten aynı türden iki işlenen üzerinde bir işlemi temsil eder.

4

BiPredicate<T,U>

İki bağımsız değişkenin bir yüklemini (Boole değerli işlev) temsil eder.

5

BooleanSupplier

Boole değerli sonuçların tedarikçisini temsil eder.

6

Consumer<T>

Tek bir giriş bağımsız değişkenini kabul eden ve sonuç döndürmeyen bir işlemi temsil eder.

7

DoubleBinaryOperator

İki çift değerli işlenen üzerinde bir işlemi temsil eder ve çift değerli bir sonuç üretir.

8

DoubleConsumer

Tek bir çift değerli bağımsız değişkeni kabul eden ve sonuç döndürmeyen bir işlemi temsil eder.

9

DoubleFunction<R>

Çift değerli bir bağımsız değişkeni kabul eden ve bir sonuç üreten bir işlevi temsil eder.

10

DoublePredicate

Çift değerli bir bağımsız değişkenin bir yüklemini (Boole değerli işlev) temsil eder.

11

DoubleSupplier

Çift değerli sonuçların tedarikçisini temsil eder.

12

DoubleToIntFunction

Çift değerli bir bağımsız değişkeni kabul eden ve int değerli bir sonuç üreten bir işlevi temsil eder.

13

DoubleToLongFunction

Çift değerli bir bağımsız değişkeni kabul eden ve uzun değerli bir sonuç üreten bir işlevi temsil eder.

14

DoubleUnaryOperator

Çift değerli bir sonuç üreten tek bir çift değerli işlenen üzerinde bir işlemi temsil eder.

15

Function<T,R>

Bir bağımsız değişkeni kabul eden ve bir sonuç üreten bir işlevi temsil eder.

16

IntBinaryOperator

İki adet int değerli işlenen üzerinde bir işlemi temsil eder ve int değerli bir sonuç üretir.

17

IntConsumer

Tek bir int değerli bağımsız değişkeni kabul eden ve sonuç döndürmeyen bir işlemi temsil eder.

18

IntFunction<R>

İnt değerli bir bağımsız değişkeni kabul eden ve bir sonuç üreten bir işlevi temsil eder.

19

IntPredicate

Tek bir int değerli bağımsız değişkenin bir yüklemini (Boole değerli işlev) temsil eder.

20

IntSupplier

İnt değerli sonuçların tedarikçisini temsil eder.

21

IntToDoubleFunction

İnt değerli bir argümanı kabul eden ve çift değerli bir sonuç üreten bir işlevi temsil eder.

22

IntToLongFunction

İnt değerli bir bağımsız değişkeni kabul eden ve uzun değerli bir sonuç üreten bir işlevi temsil eder.

23

IntUnaryOperator

İnt değerli bir sonuç üreten tek bir int değerli işlenen üzerinde bir işlemi temsil eder.

24

LongBinaryOperator

İki uzun değerli işlenen üzerine bir işlemi temsil eder ve uzun değerli bir sonuç üretir.

25

LongConsumer

Uzun değerli tek bir bağımsız değişkeni kabul eden ve sonuç döndürmeyen bir işlemi temsil eder.

26

LongFunction<R>

Uzun değerli bir bağımsız değişkeni kabul eden ve bir sonuç üreten bir işlevi temsil eder.

27

LongPredicate

Uzun değerli bir bağımsız değişkenin bir yüklemini (Boole değerli işlev) temsil eder.

28

LongSupplier

Uzun değerli sonuçların tedarikçisini temsil eder.

29

LongToDoubleFunction

Uzun değerli bir bağımsız değişkeni kabul eden ve çift değerli bir sonuç üreten bir işlevi temsil eder.

30

LongToIntFunction

Uzun değerli bir bağımsız değişkeni kabul eden ve int değerli bir sonuç üreten bir işlevi temsil eder.

31

LongUnaryOperator

Uzun değerli bir sonuç üreten tek bir uzun değerli işlenen üzerinde bir işlemi temsil eder.

32

ObjDoubleConsumer<T>

Nesne değerli ve çift değerli bir bağımsız değişkeni kabul eden ve sonuç döndürmeyen bir işlemi temsil eder.

33

ObjIntConsumer<T>

Nesne değerli ve int değerli bir bağımsız değişkeni kabul eden ve sonuç döndürmeyen bir işlemi temsil eder.

34

ObjLongConsumer<T>

Nesne değerli ve uzun değerli bir bağımsız değişkeni kabul eden ve sonuç döndürmeyen bir işlemi temsil eder.

35

Predicate<T>

Bir bağımsız değişkenin bir yüklemini (Boole değerli işlev) temsil eder.

36

Supplier<T>

Bir sonuç tedarikçisini temsil eder.

37

ToDoubleBiFunction<T,U>

İki bağımsız değişkeni kabul eden ve çift değerli bir sonuç üreten bir işlevi temsil eder.

38

ToDoubleFunction<T>

Çift değerli bir sonuç üreten bir işlevi temsil eder.

39

ToIntBiFunction<T,U>

İki bağımsız değişkeni kabul eden ve int değerli bir sonuç üreten bir işlevi temsil eder.

40

ToIntFunction<T>

İnt değerli bir sonuç üreten bir işlevi temsil eder.

41

ToLongBiFunction<T,U>

İki bağımsız değişkeni kabul eden ve uzun değerli bir sonuç üreten bir işlevi temsil eder.

42

ToLongFunction<T>

Uzun değerli bir sonuç üreten bir işlevi temsil eder.

43

UnaryOperator<T>

İşleneniyle aynı türde bir sonuç üreten tek bir işlenen üzerinde bir işlemi temsil eder.

İşlevsel Arayüz Örneği

Predicate <T> arayüzü, bir Boolean değeri döndürmek için bir yöntem testi (Nesne) içeren işlevsel bir arayüzdür. Bu arayüz, bir nesnenin doğru veya yanlış olarak test edildiğini belirtir.

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Burada, tek bir girdi alan ve Boolean'ı döndüren Predicate arayüzünü geçtik.

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki çıktıyı üretmelidir -

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, arayüzlerde yeni bir varsayılan yöntem uygulaması kavramı sunar. Bu yetenek, geriye dönük uyumluluk için eklenmiştir, böylece eski arayüzler Java 8'in lambda ifade özelliğinden yararlanmak için kullanılabilir.

Örneğin, 'List' veya 'Collection' arabirimlerinde 'forEach' yöntem bildirimi yoktur. Bu nedenle, böyle bir yöntemin eklenmesi, koleksiyon çerçevesi uygulamalarını basitçe kıracaktır. Java 8, List / Collection arabiriminin forEach yönteminin varsayılan uygulamasına sahip olabilmesi için varsayılan yöntemi sunar ve bu arabirimleri uygulayan sınıfın aynı yöntemi uygulaması gerekmez.

Sözdizimi

public interface vehicle {

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

Birden Çok Varsayılan

Arabirimlerdeki varsayılan işlevlerle, bir sınıfın aynı varsayılan yöntemlerle iki arabirim uygulaması olasılığı vardır. Aşağıdaki kod, bu belirsizliğin nasıl çözülebileceğini açıklamaktadır.

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

İlk çözüm, varsayılan uygulamayı geçersiz kılan kendi yöntemini oluşturmaktır.

public class car implements vehicle, fourWheeler {

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

İkinci çözüm, belirtilen arayüzün varsayılan yöntemini süper kullanarak çağırmaktır.

public class car implements vehicle, fourWheeler {

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

Statik Varsayılan Yöntemler

Bir arabirim ayrıca Java 8'den itibaren statik yardımcı yöntemlere sahip olabilir.

public interface vehicle {

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

Varsayılan Yöntem Örneği

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki çıktıyı üretmelidir -

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

Akış, Java 8'de tanıtılan yeni bir soyut katmandır. Akış kullanarak, verileri SQL deyimlerine benzer şekilde bildirime dayalı bir şekilde işleyebilirsiniz. Örneğin, aşağıdaki SQL ifadesini düşünün.

SELECT max(salary), employee_id, employee_name FROM Employee

Yukarıdaki SQL ifadesi, geliştiricinin tarafında herhangi bir hesaplama yapmadan, maksimum maaşlı çalışanın ayrıntılarını otomatik olarak döndürür. Java'da koleksiyon çerçevesini kullanan bir geliştiricinin döngüler kullanması ve tekrarlanan kontroller yapması gerekir. Diğer bir endişe ise verimliliktir; çok çekirdekli işlemciler kolaylıkla temin edilebildiğinden, bir Java geliştiricisi hataya oldukça açık olabilen paralel kod işleme yazmak zorundadır.

Bu tür sorunları çözmek için Java 8, geliştiricinin verileri bildirimsel olarak işlemesine ve bunun için herhangi bir özel kod yazmaya gerek kalmadan çok çekirdekli mimariden yararlanmasına olanak tanıyan akış kavramını tanıttı.

Akış nedir?

Akış, bir kaynaktan toplanan işlemleri destekleyen bir dizi nesneyi temsil eder. Bir Akışın özellikleri aşağıdadır -

  • Sequence of elements- Bir akış, sıralı bir şekilde belirli türden bir dizi öğe sağlar. Bir akış, öğeleri talep üzerine alır / hesaplar. Öğeleri asla saklamaz.

  • Source - Akış, Giriş kaynağı olarak Koleksiyonları, Dizileri veya G / Ç kaynaklarını alır.

  • Aggregate operations - Akış; filtre, eşleme, sınırlama, azaltma, bulma, eşleştirme vb. Gibi toplu işlemleri destekler.

  • Pipelining- Akış işlemlerinin çoğu, sonuçlarının ardışık düzenlenmesi için akışı kendisi döndürür. Bu işlemlere ara işlemler denir ve işlevleri girdi almak, bunları işlemek ve çıktıyı hedefe döndürmektir. Collect () yöntemi, akışın sonunu işaretlemek için normal olarak boru hattı işleminin sonunda mevcut olan bir terminal işlemidir.

  • Automatic iterations - Akış işlemleri, açık yinelemenin gerekli olduğu Koleksiyonların aksine, yinelemeleri sağlanan kaynak öğeler üzerinden dahili olarak yapar.

Akış Oluşturma

Java 8 ile, Koleksiyon arayüzünün bir Akış oluşturmak için iki yöntemi vardır.

  • stream() - Koleksiyonu kaynağı olarak dikkate alan sıralı bir akış döndürür.

  • parallelStream() - Koleksiyonun kaynağı olduğunu düşünen paralel bir Akış döndürür.

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

her biri için

Akış, akışın her bir öğesini yinelemek için yeni bir 'forEach' yöntemi sağladı. Aşağıdaki kod segmenti, forEach kullanarak 10 rastgele sayının nasıl yazdırılacağını gösterir.

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

harita

'Eşleme' yöntemi, her bir öğeyi karşılık gelen sonuca eşlemek için kullanılır. Aşağıdaki kod segmenti, haritayı kullanarak benzersiz sayı kareleri yazdırır.

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

filtre

'Filtre' yöntemi, bir kriter temelinde öğeleri elemek için kullanılır. Aşağıdaki kod kesimi, filtreyi kullanarak bir dizi boş dizge yazdırır.

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

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

limit

Akışın boyutunu azaltmak için 'limit' yöntemi kullanılır. Aşağıdaki kod segmenti, limit kullanarak 10 rastgele sayının nasıl yazdırılacağını gösterir.

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

sıralanmış

Akışı sıralamak için 'sıralanmış' yöntemi kullanılır. Aşağıdaki kod segmenti, 10 rastgele sayının sıralı bir sırada nasıl yazdırılacağını gösterir.

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

Paralel İşleme

parallelStream, paralel işleme için akışın alternatifidir. ParallelStream kullanarak bir dizi boş dizeyi yazdıran aşağıdaki kod parçasına bir göz atın.

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

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

Sıralı ve paralel akışlar arasında geçiş yapmak çok kolaydır.

Koleksiyonerler

Toplayıcılar, işlemin sonucunu bir akışın öğeleri üzerinde birleştirmek için kullanılır. Toplayıcılar, bir liste veya dizeyi döndürmek için kullanılabilir.

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

Java 8 ile, akış işleme yapılırken tüm istatistikleri hesaplamak için istatistik toplayıcılar tanıtılır.

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

Akış Örneği

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki sonucu vermelidir -

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

İsteğe bağlı, boş olmayan nesneleri içermekte kullanılan bir kap nesnesidir. İsteğe bağlı nesne, boş değeri olmayan değerle temsil etmek için kullanılır. Bu sınıf, kodun boş değerleri kontrol etmek yerine değerleri 'kullanılabilir' veya 'kullanılamaz' olarak işlemesini kolaylaştırmak için çeşitli yardımcı yöntemlere sahiptir. Java 8'de tanıtıldı ve Guava'da İsteğe Bağlı olana benzer.

Sınıf Beyanı

Aşağıdaki beyanı java.util.Optional<T> sınıf -

public final class Optional<T> extends Object

Sınıf Yöntemi

Sr.No. Yöntem ve Açıklama
1

static <T> Optional<T> empty()

Boş bir İsteğe Bağlı örnek döndürür.

2

boolean equals(Object obj)

Başka bir nesnenin bu İsteğe bağlı "eşit" olup olmadığını gösterir.

3

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

Bir değer varsa ve değer belirli bir yüklemle eşleşiyorsa, değeri açıklayan İsteğe Bağlı bir döndürür, aksi takdirde boş bir İsteğe Bağlı döndürür.

4

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

Bir değer varsa, sağlanan İsteğe bağlı yatak eşleme işlevini ona uygular, bu sonucu döndürür, aksi takdirde boş bir İsteğe Bağlı döndürür.

5

T get()

Bu İsteğe Bağlı'da bir değer varsa, değeri döndürür, aksi takdirde NoSuchElementException oluşturur.

6

int hashCode()

Varsa, mevcut değerin karma kodu değerini veya değer yoksa 0 (sıfır) döndürür.

7

void ifPresent(Consumer<? super T> consumer)

Bir değer varsa, belirtilen tüketiciyi değerle çağırır, aksi takdirde hiçbir şey yapmaz.

8

boolean isPresent()

Mevcut bir değer varsa true, aksi takdirde false döndürür.

9

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

Bir değer varsa, sağlanan eşleme işlevini ona uygular ve sonuç boş değilse, sonucu açıklayan bir İsteğe Bağlı döndürür.

10

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

Belirtilen mevcut boş olmayan değere sahip bir İsteğe Bağlı döndürür.

11

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

Boş değilse, belirtilen değeri açıklayan İsteğe Bağlı bir döndürür, aksi takdirde boş bir İsteğe Bağlı döndürür.

12

T orElse(T other)

Varsa değeri, aksi takdirde başka döndürür.

13

T orElseGet(Supplier<? extends T> other)

Varsa değeri döndürür, aksi takdirde diğerini çağırır ve bu çağrının sonucunu döndürür.

14

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

Varsa, içerilen değeri döndürür, aksi takdirde sağlanan tedarikçi tarafından oluşturulacak bir istisna atar.

15

String toString()

Hata ayıklamaya uygun bu İsteğe Bağlı'nın boş olmayan bir dize temsilini döndürür.

Bu sınıf, aşağıdaki sınıftan yöntemleri miras alır -

  • java.lang.Object

Opsiyonel Örnek

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki çıktıyı üretmelidir -

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

Java 8 ile, Nashorn, mevcut Rhino'nun yerini alacak çok geliştirilmiş bir javascript motoru tanıtıldı. Nashorn, kodu doğrudan bellekte derlediği ve bayt kodunu JVM'ye geçirdiği için 2 ila 10 kat daha iyi performans sağlar. Nashorn, performansı artırmak için Java 7'de sunulan dinamikleri çağırma özelliğini kullanır.

jjs

Nashorn motoru için JAVA 8, yeni bir komut satırı aracı sunuyor, jjs, konsolda javascript kodlarını çalıştırmak için.

Js dosyasını yorumlama

Dosyayı oluşturun ve kaydedin sample.js c: \> JAVA klasöründe.

sample.js

print('Hello World!');

Konsolu açın ve aşağıdaki komutu kullanın.

C:\JAVA>jjs sample.js

Aşağıdaki çıktıyı üretecektir:

Hello World!

Etkileşimli Modda jjs

Konsolu açın ve aşağıdaki komutu kullanın.

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

Bağımsız Değişkenleri Geç

Konsolu açın ve aşağıdaki komutu kullanın.

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

Java'dan JavaScript'i çağırmak

ScriptEngineManager kullanılarak, JavaScript kodu Java'da çağrılabilir ve yorumlanabilir.

Misal

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki sonucu vermelidir -

Mahesh
12

JavaScript'ten Java Çağırma

Aşağıdaki örnek, Java sınıflarının java komut dosyasında nasıl içe aktarılacağını ve kullanılacağını açıklamaktadır.

Oluştur ve kaydet sample.js c: \> JAVA klasöründe.

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

Konsolu açın ve aşağıdaki komutu kullanın.

C:\JAVA>jjs sample.js

Aşağıdaki çıktıyı üretmelidir -

78952000000000000003.20

Java 8 ile, eski tarih-saat API'sinin aşağıdaki dezavantajlarını karşılamak için yeni bir Tarih-Saat API'si tanıtıldı.

  • Not thread safe- java.util.Date iş parçacığı için güvenli değildir, bu nedenle geliştiricilerin tarihi kullanırken eşzamanlılık sorunu ile uğraşması gerekir. Yeni tarih-saat API'si değişmezdir ve ayarlayıcı yöntemlere sahip değildir.

  • Poor design- Varsayılan Tarih 1900'den başlar, ay 1'den başlar ve gün 0'dan başlar, dolayısıyla tekdüzelik yoktur. Eski API, tarih işlemleri için daha az doğrudan yöntemlere sahipti. Yeni API, bu tür işlemler için çok sayıda yardımcı yöntem sağlar.

  • Difficult time zone handling- Geliştiriciler, zaman dilimi sorunlarıyla başa çıkmak için çok fazla kod yazmak zorunda kaldı. Yeni API, alana özgü tasarım göz önünde bulundurularak geliştirilmiştir.

Java 8, java.time paketi altında yeni bir tarih-saat API'si sunar. Aşağıda java.time paketinde tanıtılan bazı önemli sınıflar yer almaktadır.

  • Local - Zaman dilimi işlemenin karmaşıklığı olmadan basitleştirilmiş tarih-saat API'si.

  • Zoned - Çeşitli saat dilimleriyle ilgilenmek için özel tarih-saat API'si.

Yerel Tarih-Saat API'si

LocalDate / LocalTime ve LocalDateTime sınıfları, saat dilimlerinin gerekli olmadığı durumlarda geliştirmeyi basitleştirir. Onları iş başında görelim.

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki çıktıyı üretmelidir -

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

Bölgeli Tarih-Saat API'si

Bölgelere ayrılmış tarih-saat API'si, saat dilimi dikkate alınacağı zaman kullanılacaktır. Onları eylem halinde görelim.

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki çıktıyı üretmelidir -

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

Krono Birimleri Enum

java.time.temporal.ChronoUnit numaralandırması, eski API'de gün, ay vb. temsil eden tamsayı değerlerini değiştirmek için Java 8'e eklenir. Bunları eylemde görelim.

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki sonucu vermelidir -

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

Süre ve Süre

Java 8 ile, zaman farklarıyla başa çıkmak için iki özel sınıf sunulur.

  • Period - Tarih bazlı zaman miktarı ile ilgilenir.

  • Duration - Zamana dayalı zaman miktarı ile ilgilenir.

Onları eylem halinde görelim.

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki çıktıyı üretmelidir -

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

Zamansal Düzenleyiciler

TemporalAdjuster, tarih matematiğini gerçekleştirmek için kullanılır. Örneğin, "Ayın İkinci Cumartesisi" veya "Gelecek Salı" olsun. Onları eylem halinde görelim.

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki sonucu vermelidir -

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

Geriye dönük uyumluluk

Orijinal Date ve Calendar nesnelerine, onları yeni Date-Time API'ye dönüştürmek için kullanılabilen bir toInstant () yöntemi eklenir. LocalDateTime veya ZonedDateTime nesnesini almak için ofInstant (Insant, ZoneId) yöntemini kullanın. Onları eylem halinde görelim.

C: \> JAVA'da seçtiğiniz herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki çıktıyı üretmelidir -

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]

Java 8 ile Base64 nihayet hakkını aldı. Java 8 artık Base64 kodlaması için dahili kodlayıcı ve kod çözücüye sahiptir. Java 8'de üç tür Base64 kodlaması kullanabiliriz.

  • Simple- Çıktı, A-Za-z0-9 + / içinde bulunan bir dizi karakterle eşlenir. Kodlayıcı, çıktıya herhangi bir satır besleme eklemez ve kod çözücü, A-Za-z0-9 + / dışında herhangi bir karakteri reddeder.

  • URL- Çıktı, A-Za-z0-9 + _ içinde bulunan karakter kümesine eşlenir. Çıktı URL ve dosya adı güvenlidir.

  • MIME- Çıktı, MIME uyumlu biçime eşlenir. Çıktı, her biri 76 karakterden fazla olmayan satırlarla temsil edilir ve satır ayırıcı olarak satır başı '\ r' ve ardından satır besleme '\ n' kullanır. Kodlanan çıktının sonunda satır ayırıcı yok.

Yuvalanmış Sınıflar

Sr.No. İç içe geçmiş sınıf ve Açıklama
1

static class Base64.Decoder

Bu sınıf, RFC 4648 ve RFC 2045'te belirtildiği gibi Base64 kodlama şemasını kullanarak bayt verilerinin kodunu çözmek için bir kod çözücü uygular.

2

static class Base64.Encoder

Bu sınıf, RFC 4648 ve RFC 2045'te belirtildiği gibi Base64 kodlama şemasını kullanarak bayt verilerini kodlamak için bir kodlayıcı uygular.

Yöntemler

Sr.No. Yöntem Adı ve Açıklaması
1

static Base64.Decoder getDecoder()

Temel türdeki base64 kodlama şemasını kullanarak kodunu çözen bir Base64.Decoder döndürür.

2

static Base64.Encoder getEncoder()

Basic tip base64 kodlama şemasını kullanarak kodlayan bir Base64.Encoder döndürür.

3

static Base64.Decoder getMimeDecoder()

MIME türü base64 kod çözme şemasını kullanarak kodu çözen bir Base64.Decoder döndürür.

4

static Base64.Encoder getMimeEncoder()

MIME türü base64 kodlama şemasını kullanarak kodlayan bir Base64.Encoder döndürür.

5

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

Belirtilen satır uzunluğu ve satır ayırıcılarıyla MIME türü base64 kodlama şemasını kullanarak kodlayan bir Base64.Encoder döndürür.

6

static Base64.Decoder getUrlDecoder()

URL ve Dosya adı güvenli tür base64 kodlama şemasını kullanarak kodu çözen bir Base64.Decoder döndürür.

7

static Base64.Encoder getUrlEncoder()

URL ve Filename safe type base64 kodlama şemasını kullanarak kodlayan bir Base64.Encoder döndürür.

Miras Alınan Yöntemler

Bu sınıf, aşağıdaki sınıftan yöntemleri miras alır -

  • java.lang.Object

Base64 Örneği

C: /> JAVA gibi herhangi bir düzenleyiciyi kullanarak aşağıdaki Java programını oluşturun.

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

Sonucu Doğrulayın

Kullanarak sınıfı derleyin javac aşağıdaki gibi derleyici -

C:\JAVA>javac Java8Tester.java

Şimdi Java8Tester'i aşağıdaki gibi çalıştırın -

C:\JAVA>java Java8Tester

Aşağıdaki çıktıyı üretmelidir -

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