Java 8 - Hướng dẫn nhanh

JAVA 8 là một bản phát hành tính năng chính của việc phát triển ngôn ngữ lập trình JAVA. Phiên bản đầu tiên của nó được phát hành vào ngày 18 tháng 3 năm 2014. Với bản phát hành Java 8, Java cung cấp hỗ trợ cho lập trình chức năng, công cụ JavaScript mới, các API mới để thao tác ngày giờ, API phát trực tuyến mới, v.v.

Các tính năng mới

  • Lambda expression - Thêm khả năng xử lý chức năng cho Java.

  • Method references- Tham chiếu các chức năng bằng tên của chúng thay vì gọi chúng trực tiếp. Sử dụng các hàm làm tham số.

  • Default method - Giao diện có phương thức thực thi mặc định.

  • New tools - Các công cụ và tiện ích trình biên dịch mới được thêm vào như 'jdeps' để tìm ra sự phụ thuộc.

  • Stream API - API luồng mới để tạo điều kiện xử lý đường ống.

  • Date Time API - Cải thiện API ngày giờ.

  • Optional - Nhấn mạnh vào các phương pháp hay nhất để xử lý các giá trị null đúng cách.

  • Nashorn, JavaScript Engine - Một công cụ dựa trên Java để thực thi mã JavaScript.

Hãy xem xét đoạn mã sau.

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

Chạy chương trình để nhận kết quả sau.

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

Đây sortUsingJava8() phương thức sử dụng hàm sắp xếp với biểu thức lambda làm tham số để nhận tiêu chí sắp xếp.

Thiết lập môi trường cục bộ

Nếu bạn muốn thiết lập môi trường riêng cho ngôn ngữ lập trình Java, thì phần này sẽ hướng dẫn bạn toàn bộ quá trình. Vui lòng làm theo các bước dưới đây để thiết lập môi trường Java của bạn.

Java SE có thể được tải xuống miễn phí từ liên kết sau:

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

Bạn tải xuống một phiên bản dựa trên hệ điều hành của bạn.

Làm theo hướng dẫn để tải xuống Java và chạy .exeđể cài đặt Java trên máy của bạn. Khi bạn đã cài đặt Java trên máy của mình, bạn sẽ cần đặt các biến môi trường để trỏ đến các thư mục cài đặt chính xác.

Thiết lập đường dẫn cho Windows 2000 / XP

Giả sử bạn đã cài đặt Java trong thư mục c: \ Program Files \ java \ jdk -

  • Nhấp chuột phải vào 'Máy tính của tôi' và chọn 'Thuộc tính'.

  • Nhấp vào nút 'Biến môi trường' trong tab 'Nâng cao'.

  • Bây giờ, hãy thay đổi biến 'Đường dẫn' để nó cũng chứa đường dẫn đến tệp thực thi Java. Ví dụ: nếu đường dẫn hiện được đặt thành 'C: \ WINDOWS \ SYSTEM32', thì hãy thay đổi đường dẫn của bạn thành 'C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin'.

Thiết lập đường dẫn cho Windows 95/98 / ME

Giả sử bạn đã cài đặt Java trong thư mục c: \ Program Files \ java \ jdk -

  • Chỉnh sửa tệp 'C: \ autoexec.bat' và thêm dòng sau vào cuối -

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

Thiết lập đường dẫn cho Linux, UNIX, Solaris, FreeBSD

Biến môi trường PATH nên được đặt để trỏ đến nơi các tệp nhị phân Java đã được cài đặt. Tham khảo tài liệu shell của bạn nếu bạn gặp khó khăn khi thực hiện việc này.

Ví dụ: nếu bạn sử dụng bash làm trình bao của mình, thì bạn sẽ thêm dòng sau vào cuối '.bashrc: export PATH = / path / to / java: $ PATH'

Trình chỉnh sửa Java phổ biến

Để viết các chương trình Java, bạn cần một trình soạn thảo văn bản. Thậm chí có nhiều IDE phức tạp hơn có sẵn trên thị trường. Nhưng hiện tại, bạn có thể xem xét một trong những điều sau:

  • Notepad - Trên máy Windows, bạn có thể sử dụng bất kỳ trình soạn thảo văn bản đơn giản nào như Notepad (được khuyến nghị cho hướng dẫn này) hoặc TextPad.

  • Netbeans- Nó là một Java IDE mã nguồn mở và miễn phí. Nó có thể được tải xuống từhttps://netbeans.org/index.html.

  • Eclipse - Nó cũng là một IDE Java được phát triển bởi cộng đồng nguồn mở Eclipse và có thể được tải xuống từ https://www.eclipse.org/.

Biểu thức Lambda được giới thiệu trong Java 8 và được coi là tính năng lớn nhất của Java 8. Biểu thức lambda tạo điều kiện thuận lợi cho việc lập trình hàm và đơn giản hóa việc phát triển rất nhiều.

Cú pháp

Một biểu thức lambda được đặc trưng bởi cú pháp sau.

parameter -> expression body

Sau đây là các đặc điểm quan trọng của biểu thức lambda.

  • Optional type declaration- Không cần khai báo kiểu của một tham số. Trình biên dịch có thể suy luận tương tự từ giá trị của tham số.

  • Optional parenthesis around parameter- Không cần khai báo một tham số duy nhất trong ngoặc đơn. Đối với nhiều tham số, dấu ngoặc đơn là bắt buộc.

  • Optional curly braces - Không cần sử dụng dấu ngoặc nhọn trong phần thân biểu thức nếu phần thân chứa một câu lệnh đơn.

  • Optional return keyword- Trình biên dịch tự động trả về giá trị nếu phần thân có một biểu thức duy nhất để trả về giá trị. Dấu ngoặc nhọn được yêu cầu để chỉ ra rằng biểu thức trả về một giá trị.

Ví dụ về biểu thức Lambda

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

public class Java8Tester {

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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

Sau đây là những điểm quan trọng được xem xét trong ví dụ trên.

  • Biểu thức Lambda được sử dụng chủ yếu để xác định việc triển khai nội tuyến của một giao diện chức năng, tức là một giao diện chỉ có một phương thức duy nhất. Trong ví dụ trên, chúng tôi đã sử dụng nhiều loại biểu thức lambda khác nhau để xác định phương thức hoạt động của giao diện MathOperation. Sau đó, chúng tôi đã xác định việc triển khai sayMessage của GreetingService.

  • Biểu thức Lambda loại bỏ sự cần thiết của lớp ẩn danh và cung cấp khả năng lập trình chức năng rất đơn giản nhưng mạnh mẽ cho Java.

Phạm vi

Sử dụng biểu thức lambda, bạn có thể tham chiếu đến bất kỳ biến cuối cùng nào hoặc biến cuối cùng hiệu quả (chỉ được gán một lần). Biểu thức Lambda đưa ra một lỗi biên dịch, nếu một biến được gán giá trị lần thứ hai.

Ví dụ về phạm vi

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

public class Java8Tester {

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

Hello! Mahesh

Các tham chiếu phương thức giúp trỏ đến các phương thức theo tên của chúng. Tham chiếu phương thức được mô tả bằng ký hiệu "::". Tham chiếu phương thức có thể được sử dụng để chỉ ra các loại phương thức sau:

  • Phương pháp tĩnh
  • Phương pháp phiên bản
  • Các trình xây dựng sử dụng toán tử mới (TreeSet :: new)

Ví dụ tham chiếu phương pháp

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

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

public class Java8Tester {

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

Ở đây chúng ta đã chuyển phương thức System.out :: println làm tham chiếu phương thức tĩnh.

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

Mahesh
Suresh
Ramesh
Naresh
Kalpesh

Các giao diện chức năng có một chức năng duy nhất để trưng bày. Ví dụ: giao diện So sánh với một phương thức duy nhất 'CompareTo' được sử dụng cho mục đích so sánh. Java 8 đã định nghĩa rất nhiều giao diện chức năng được sử dụng rộng rãi trong các biểu thức lambda. Sau đây là danh sách các giao diện chức năng được định nghĩa trong gói java.util.Function.

Sr.No. Giao diện & Mô tả
1

BiConsumer<T,U>

Biểu diễn một phép toán chấp nhận hai đối số đầu vào và không trả về kết quả nào.

2

BiFunction<T,U,R>

Biểu diễn một hàm chấp nhận hai đối số và tạo ra một kết quả.

3

BinaryOperator<T>

Biểu diễn một phép toán dựa trên hai toán hạng cùng kiểu, tạo ra kết quả cùng kiểu với toán hạng.

4

BiPredicate<T,U>

Biểu diễn một vị từ (hàm có giá trị Boolean) gồm hai đối số.

5

BooleanSupplier

Đại diện cho một nhà cung cấp các kết quả có giá trị Boolean.

6

Consumer<T>

Biểu diễn một thao tác chấp nhận một đối số đầu vào duy nhất và không trả về kết quả nào.

7

DoubleBinaryOperator

Biểu diễn một phép toán dựa trên hai toán hạng có giá trị kép và tạo ra kết quả có giá trị kép.

số 8

DoubleConsumer

Đại diện cho một phép toán chấp nhận một đối số có giá trị kép duy nhất và không trả về kết quả nào.

9

DoubleFunction<R>

Biểu diễn một hàm chấp nhận một đối số có giá trị kép và tạo ra một kết quả.

10

DoublePredicate

Biểu diễn một vị từ (hàm có giá trị Boolean) của một đối số có giá trị kép.

11

DoubleSupplier

Đại diện cho một nhà cung cấp các kết quả có giá trị kép.

12

DoubleToIntFunction

Biểu diễn một hàm chấp nhận đối số có giá trị kép và tạo ra kết quả có giá trị int.

13

DoubleToLongFunction

Biểu diễn một hàm chấp nhận đối số có giá trị kép và tạo ra kết quả có giá trị dài.

14

DoubleUnaryOperator

Biểu diễn một phép toán trên một toán hạng có giá trị kép duy nhất tạo ra kết quả có giá trị kép.

15

Function<T,R>

Biểu diễn một hàm chấp nhận một đối số và tạo ra một kết quả.

16

IntBinaryOperator

Biểu diễn một phép toán dựa trên hai toán hạng có giá trị int và tạo ra kết quả có giá trị int.

17

IntConsumer

Biểu diễn một phép toán chấp nhận một đối số có giá trị int và không trả về kết quả nào.

18

IntFunction<R>

Biểu diễn một hàm chấp nhận một đối số có giá trị int và tạo ra một kết quả.

19

IntPredicate

Biểu diễn một vị từ (hàm có giá trị Boolean) của một đối số có giá trị int.

20

IntSupplier

Đại diện cho một nhà cung cấp các kết quả có giá trị int.

21

IntToDoubleFunction

Biểu diễn một hàm chấp nhận đối số có giá trị int và tạo ra kết quả có giá trị kép.

22

IntToLongFunction

Biểu diễn một hàm chấp nhận đối số có giá trị int và tạo ra kết quả có giá trị dài.

23

IntUnaryOperator

Biểu diễn một phép toán trên một toán hạng có giá trị int duy nhất tạo ra kết quả có giá trị int.

24

LongBinaryOperator

Biểu diễn một phép toán dựa trên hai toán hạng có giá trị dài và tạo ra kết quả có giá trị dài.

25

LongConsumer

Đại diện cho một phép toán chấp nhận một đối số có giá trị dài và không trả về kết quả nào.

26

LongFunction<R>

Biểu diễn một hàm chấp nhận một đối số có giá trị dài và tạo ra một kết quả.

27

LongPredicate

Đại diện cho một vị từ (hàm có giá trị Boolean) của một đối số có giá trị dài.

28

LongSupplier

Đại diện cho nhà cung cấp các kết quả có giá trị lâu dài.

29

LongToDoubleFunction

Biểu diễn một hàm chấp nhận đối số có giá trị dài và tạo ra kết quả có giá trị kép.

30

LongToIntFunction

Biểu diễn một hàm chấp nhận đối số có giá trị dài và tạo ra kết quả có giá trị int.

31

LongUnaryOperator

Biểu diễn một phép toán trên một toán hạng có giá trị dài duy nhất tạo ra kết quả có giá trị dài.

32

ObjDoubleConsumer<T>

Đại diện cho một phép toán chấp nhận đối số có giá trị đối tượng và đối số có giá trị kép và không trả về kết quả nào.

33

ObjIntConsumer<T>

Đại diện cho một phép toán chấp nhận một đối số có giá trị đối tượng và một đối số có giá trị int và không trả về kết quả nào.

34

ObjLongConsumer<T>

Đại diện cho một phép toán chấp nhận một đối số có giá trị đối tượng và một đối số có giá trị dài và không trả về kết quả nào.

35

Predicate<T>

Biểu diễn một vị từ (hàm có giá trị Boolean) của một đối số.

36

Supplier<T>

Đại diện cho một nhà cung cấp kết quả.

37

ToDoubleBiFunction<T,U>

Biểu diễn một hàm chấp nhận hai đối số và tạo ra một kết quả có giá trị kép.

38

ToDoubleFunction<T>

Biểu diễn một hàm tạo ra kết quả có giá trị kép.

39

ToIntBiFunction<T,U>

Biểu diễn một hàm chấp nhận hai đối số và tạo ra kết quả có giá trị int.

40

ToIntFunction<T>

Biểu diễn một hàm tạo ra kết quả có giá trị int.

41

ToLongBiFunction<T,U>

Biểu diễn một hàm chấp nhận hai đối số và tạo ra một kết quả có giá trị dài.

42

ToLongFunction<T>

Biểu diễn một hàm tạo ra kết quả có giá trị dài.

43

UnaryOperator<T>

Biểu diễn một phép toán trên một toán hạng duy nhất tạo ra kết quả cùng kiểu với toán hạng của nó.

Ví dụ về giao diện chức năng

Giao diện Predicate <T> là một giao diện chức năng có kiểm tra phương thức (Đối tượng) để trả về giá trị Boolean. Giao diện này biểu thị rằng một đối tượng được kiểm tra là đúng hay sai.

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

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

public class Java8Tester {

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

      for(Integer n: list) {

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

Ở đây chúng ta đã chuyển giao diện Predicate, giao diện này nhận một đầu vào duy nhất và trả về Boolean.

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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 giới thiệu một khái niệm mới về việc triển khai phương thức mặc định trong các giao diện. Khả năng này được thêm vào để tương thích ngược để các giao diện cũ có thể được sử dụng để tận dụng khả năng biểu thức lambda của Java 8.

Ví dụ: giao diện 'Danh sách' hoặc 'Bộ sưu tập' không có khai báo phương thức 'forEach'. Do đó, việc thêm phương thức như vậy sẽ đơn giản phá vỡ các triển khai khung sưu tập. Java 8 giới thiệu phương thức mặc định để giao diện List / Collection có thể có một triển khai mặc định của phương thức forEach và lớp triển khai các giao diện này không cần triển khai giống nhau.

Cú pháp

public interface vehicle {

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

Nhiều mặc định

Với các chức năng mặc định trong giao diện, có khả năng một lớp đang triển khai hai giao diện với các phương thức mặc định giống nhau. Đoạn mã sau giải thích cách giải quyết sự không rõ ràng này.

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

Giải pháp đầu tiên là tạo một phương thức riêng ghi đè triển khai mặc định.

public class car implements vehicle, fourWheeler {

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

Giải pháp thứ hai là gọi phương thức mặc định của giao diện được chỉ định bằng cách sử dụng super.

public class car implements vehicle, fourWheeler {

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

Phương thức mặc định tĩnh

Một giao diện cũng có thể có các phương thức trợ giúp tĩnh từ Java 8 trở đi.

public interface vehicle {

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

Ví dụ về phương pháp mặc định

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

public class Java8Tester {

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

interface Vehicle {

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

interface FourWheeler {

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

class Car implements Vehicle, FourWheeler {

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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

Stream là một lớp trừu tượng mới được giới thiệu trong Java 8. Sử dụng stream, bạn có thể xử lý dữ liệu theo cách khai báo tương tự như các câu lệnh SQL. Ví dụ, hãy xem xét câu lệnh SQL sau.

SELECT max(salary), employee_id, employee_name FROM Employee

Biểu thức SQL ở trên tự động trả về thông tin chi tiết của nhân viên được trả lương tối đa mà không cần thực hiện bất kỳ tính toán nào từ phía nhà phát triển. Sử dụng khung tập hợp trong Java, một nhà phát triển phải sử dụng các vòng lặp và thực hiện kiểm tra nhiều lần. Một mối quan tâm khác là hiệu quả; vì các bộ xử lý đa lõi có sẵn một cách thoải mái, một nhà phát triển Java phải viết xử lý mã song song có thể dễ xảy ra lỗi.

Để giải quyết các vấn đề như vậy, Java 8 đã đưa ra khái niệm luồng cho phép nhà phát triển xử lý dữ liệu một cách khai báo và tận dụng kiến ​​trúc đa lõi mà không cần phải viết bất kỳ mã cụ thể nào cho nó.

Stream là gì?

Luồng đại diện cho một chuỗi các đối tượng từ một nguồn, hỗ trợ các hoạt động tổng hợp. Sau đây là các đặc điểm của Luồng:

  • Sequence of elements- Luồng cung cấp một tập hợp các phần tử của kiểu cụ thể một cách tuần tự. Luồng nhận / tính toán các phần tử theo yêu cầu. Nó không bao giờ lưu trữ các phần tử.

  • Source - Luồng lấy Bộ sưu tập, Mảng hoặc tài nguyên I / O làm nguồn đầu vào.

  • Aggregate operations - Luồng hỗ trợ các hoạt động tổng hợp như bộ lọc, bản đồ, giới hạn, giảm, tìm, so khớp, v.v.

  • Pipelining- Hầu hết các hoạt động luồng đều trả về chính luồng để kết quả của chúng có thể được kết nối. Các hoạt động này được gọi là các hoạt động trung gian và chức năng của chúng là lấy đầu vào, xử lý và trả đầu ra cho đích. Phương thức collect () là một hoạt động đầu cuối thường xuất hiện ở cuối hoạt động pipelining để đánh dấu sự kết thúc của luồng.

  • Automatic iterations - Các hoạt động luồng thực hiện lặp lại nội bộ đối với các phần tử nguồn được cung cấp, ngược lại với Bộ sưu tập trong đó yêu cầu lặp lại rõ ràng.

Tạo luồng

Với Java 8, giao diện Bộ sưu tập có hai phương pháp để tạo Luồng.

  • stream() - Trả về một luồng tuần tự coi tập hợp là nguồn của nó.

  • parallelStream() - Trả về một Luồng song song coi tập hợp là nguồn của nó.

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

cho mỗi

Luồng đã cung cấp một phương thức mới 'forEach' để lặp lại từng phần tử của luồng. Đoạn mã sau đây cho thấy cách in 10 số ngẫu nhiên bằng forEach.

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

bản đồ

Phương pháp 'bản đồ' được sử dụng để ánh xạ từng phần tử với kết quả tương ứng của nó. Đoạn mã sau đây in các số ô vuông duy nhất bằng bản đồ.

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

bộ lọc

Phương pháp 'bộ lọc' được sử dụng để loại bỏ các phần tử dựa trên tiêu chí. Đoạn mã sau in ra một số chuỗi trống bằng cách sử dụng bộ lọc.

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

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

giới hạn

Phương pháp 'giới hạn' được sử dụng để giảm kích thước của luồng. Đoạn mã sau đây cho thấy cách in 10 số ngẫu nhiên sử dụng giới hạn.

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

sắp xếp

Phương thức 'sắp xếp' được sử dụng để sắp xếp luồng. Đoạn mã sau đây cho thấy cách in 10 số ngẫu nhiên theo thứ tự đã sắp xếp.

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

Tiến trình song song

llelStream là sự thay thế của luồng để xử lý song song. Hãy xem đoạn mã sau in ra một số chuỗi trống bằng dòng song song.

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

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

Rất dễ dàng chuyển đổi giữa các luồng tuần tự và song song.

Người sưu tầm

Bộ sưu tập được sử dụng để kết hợp kết quả xử lý trên các phần tử của một luồng. Bộ sưu tập có thể được sử dụng để trả về một danh sách hoặc một chuỗi.

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

Số liệu thống kê

Với Java 8, bộ thu thập thống kê được giới thiệu để tính toán tất cả các số liệu thống kê khi quá trình xử lý luồng đang được thực hiện.

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

Ví dụ về luồng

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

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

public class Java8Tester {

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

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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

Tùy chọn là một đối tượng vùng chứa được sử dụng để chứa các đối tượng not-null. Đối tượng tùy chọn được sử dụng để biểu diễn null với giá trị không có. Lớp này có nhiều phương thức tiện ích khác nhau để tạo điều kiện thuận lợi cho mã xử lý các giá trị là 'có sẵn' hoặc 'không có sẵn' thay vì kiểm tra các giá trị null. Nó được giới thiệu trong Java 8 và tương tự như tùy chọn trong Guava.

Khai báo lớp học

Sau đây là khai báo cho java.util.Optional<T> lớp học -

public final class Optional<T> extends Object

Phương pháp lớp học

Sr.No. Phương pháp & Mô tả
1

static <T> Optional<T> empty()

Trả về một phiên bản Tùy chọn trống.

2

boolean equals(Object obj)

Cho biết liệu một số đối tượng khác có "bằng" tùy chọn này hay không.

3

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

Nếu một giá trị có mặt và giá trị khớp với một vị từ nhất định, nó sẽ trả về một Tùy chọn mô tả giá trị, nếu không sẽ trả về một Tùy chọn trống.

4

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

Nếu một giá trị có mặt, nó sẽ áp dụng chức năng ánh xạ mang tùy chọn đã cung cấp cho nó, trả về kết quả đó, nếu không sẽ trả về một tùy chọn trống.

5

T get()

Nếu một giá trị có trong Tùy chọn này, trả về giá trị, nếu không thì ném NoSuchElementException.

6

int hashCode()

Trả về giá trị mã băm của giá trị hiện tại, nếu có, hoặc 0 (không) nếu không có giá trị nào.

7

void ifPresent(Consumer<? super T> consumer)

Nếu một giá trị hiện diện, nó gọi người tiêu dùng được chỉ định với giá trị, nếu không thì không có gì.

số 8

boolean isPresent()

Trả về true nếu có giá trị hiện tại, ngược lại là false.

9

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

Nếu một giá trị có mặt, hãy áp dụng hàm ánh xạ đã cung cấp cho nó và nếu kết quả khác rỗng, trả về một Tùy chọn mô tả kết quả.

10

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

Trả về một Tùy chọn với giá trị không rỗng hiện tại đã chỉ định.

11

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

Trả về một Tùy chọn mô tả giá trị được chỉ định, nếu không phải null, nếu không trả về một Tùy chọn trống.

12

T orElse(T other)

Trả về giá trị nếu có, nếu không trả về giá trị khác.

13

T orElseGet(Supplier<? extends T> other)

Trả về giá trị nếu có, nếu không sẽ gọi khác và trả về kết quả của lệnh gọi đó.

14

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

Trả về giá trị chứa, nếu có, nếu không sẽ ném ra một ngoại lệ được tạo bởi nhà cung cấp đã cung cấp.

15

String toString()

Trả về biểu diễn chuỗi không trống của Tùy chọn này phù hợp để gỡ lỗi.

Lớp này kế thừa các phương thức từ lớp sau:

  • java.lang.Object

Ví dụ tùy chọn

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

import java.util.Optional;

public class Java8Tester {

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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

Với Java 8, Nashorn, một công cụ javascript được cải tiến nhiều được giới thiệu, để thay thế Rhino hiện có. Nashorn cung cấp hiệu suất tốt hơn từ 2 đến 10 lần, vì nó trực tiếp biên dịch mã trong bộ nhớ và chuyển bytecode sang JVM. Nashorn sử dụng tính năng gọi động lực học, được giới thiệu trong Java 7 để cải thiện hiệu suất.

jjs

Đối với công cụ Nashorn, JAVA 8 giới thiệu một công cụ dòng lệnh mới, jjs, để thực thi mã javascript tại bảng điều khiển.

Thông dịch tệp js

Tạo và lưu tệp sample.js trong thư mục c: \> JAVA.

sample.js

print('Hello World!');

Mở bảng điều khiển và sử dụng lệnh sau.

C:\JAVA>jjs sample.js

Nó sẽ tạo ra kết quả sau:

Hello World!

jjs trong Chế độ tương tác

Mở bảng điều khiển và sử dụng lệnh sau.

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

Vượt qua đối số

Mở bảng điều khiển và sử dụng lệnh sau.

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

Gọi JavaScript từ Java

Sử dụng ScriptEngineManager, mã JavaScript có thể được gọi và thông dịch trong Java.

Thí dụ

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

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

public class Java8Tester {

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

Mahesh
12

Gọi Java từ JavaScript

Ví dụ sau giải thích cách nhập và sử dụng các lớp Java trong tập lệnh java.

Tạo và lưu sample.js trong thư mục c: \> JAVA.

sample.js

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

function calculate(amount, percentage) {

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

Mở bảng điều khiển và sử dụng lệnh sau.

C:\JAVA>jjs sample.js

Nó sẽ tạo ra kết quả sau:

78952000000000000003.20

Với Java 8, một API ngày-giờ mới được giới thiệu để khắc phục những nhược điểm sau của API ngày-giờ cũ.

  • Not thread safe- java.util.Date không an toàn cho chuỗi, do đó các nhà phát triển phải giải quyết vấn đề đồng thời trong khi sử dụng ngày. API date-time mới là bất biến và không có các phương thức setter.

  • Poor design- Ngày mặc định bắt đầu từ năm 1900, tháng bắt đầu từ 1 và ngày bắt đầu từ 0, do đó không có sự đồng nhất. API cũ có ít phương thức trực tiếp hơn cho các hoạt động ngày. API mới cung cấp nhiều phương thức tiện ích cho các hoạt động như vậy.

  • Difficult time zone handling- Các nhà phát triển đã phải viết rất nhiều mã để giải quyết các vấn đề về múi giờ. API mới đã được phát triển lưu ý thiết kế dành riêng cho miền.

Java 8 giới thiệu một API ngày-giờ mới trong gói java.time. Sau đây là một số lớp quan trọng được giới thiệu trong gói java.time.

  • Local - API ngày-giờ được đơn giản hóa mà không cần xử lý múi giờ phức tạp.

  • Zoned - API ngày-giờ chuyên biệt để xử lý các múi giờ khác nhau.

API ngày-giờ cục bộ

Các lớp LocalDate / LocalTime và LocalDateTime đơn giản hóa việc phát triển trong đó múi giờ không cần thiết. Hãy xem chúng hoạt động.

Tạo chương trình java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

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

public class Java8Tester {

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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

API ngày-giờ được khoanh vùng

API ngày-giờ được khoanh vùng sẽ được sử dụng khi múi giờ được xem xét. Hãy để chúng tôi thấy họ hoạt động.

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

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

public class Java8Tester {

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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

Chrono Units Enum

java.time.temporal.ChronoUnit enum được thêm vào Java 8 để thay thế các giá trị số nguyên được sử dụng trong API cũ để biểu thị ngày, tháng, v.v. Hãy để chúng tôi xem chúng hoạt động.

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

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

public class Java8Tester {

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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

Khoảng thời gian và thời lượng

Với Java 8, hai lớp chuyên biệt được giới thiệu để giải quyết sự khác biệt về thời gian.

  • Period - Nó giải quyết lượng thời gian dựa trên ngày.

  • Duration - Nó giải quyết lượng thời gian dựa trên thời gian.

Hãy để chúng tôi thấy họ hoạt động.

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

import java.time.temporal.ChronoUnit;

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

public class Java8Tester {

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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

Bộ điều chỉnh thời gian

TemporalAdjuster được sử dụng để thực hiện phép toán ngày tháng. Ví dụ: lấy "Thứ Bảy của Thứ Hai trong Tháng" hoặc "Thứ Ba Tiếp theo". Hãy để chúng tôi thấy họ hoạt động.

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

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

public class Java8Tester {

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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

Tương thích ngược

Phương thức toInstant () được thêm vào các đối tượng Ngày và Lịch ban đầu, có thể được sử dụng để chuyển đổi chúng sang API Ngày-Giờ mới. Sử dụng phương thức ofInstant (Insant, ZoneId) để lấy đối tượng LocalDateTime hoặc ZonedDateTime. Hãy để chúng tôi thấy họ hoạt động.

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: \> JAVA.

Java8Tester.java

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

import java.util.Date;

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

public class Java8Tester {

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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]

Với Java 8, Base64 cuối cùng đã đến hạn. Java 8 hiện có bộ mã hóa và giải mã sẵn có cho mã hóa Base64. Trong Java 8, chúng ta có thể sử dụng ba kiểu mã hóa Base64.

  • Simple- Đầu ra được ánh xạ tới một tập hợp các ký tự nằm trong A-Za-z0-9 + /. Bộ mã hóa không thêm bất kỳ nguồn cấp dòng nào vào đầu ra và bộ giải mã từ chối bất kỳ ký tự nào ngoài A-Za-z0-9 + /.

  • URL- Đầu ra được ánh xạ tới tập hợp các ký tự nằm trong A-Za-z0-9 + _. Đầu ra là URL và tên tệp an toàn.

  • MIME- Đầu ra được ánh xạ sang định dạng thân thiện với MIME. Đầu ra được biểu diễn bằng các dòng, mỗi dòng không quá 76 ký tự và sử dụng ký tự xuống dòng '\ r' theo sau bởi một nguồn cấp dữ liệu dòng '\ n' làm dấu phân cách dòng. Không có dấu phân cách dòng ở cuối đầu ra được mã hóa.

Lớp học lồng nhau

Sr.No. Lớp và mô tả lồng nhau
1

static class Base64.Decoder

Lớp này triển khai một bộ giải mã để giải mã dữ liệu byte sử dụng lược đồ mã hóa Base64 như được chỉ định trong RFC 4648 và RFC 2045.

2

static class Base64.Encoder

Lớp này triển khai một bộ mã hóa để mã hóa dữ liệu byte bằng cách sử dụng lược đồ mã hóa Base64 như được chỉ định trong RFC 4648 và RFC 2045.

Phương pháp

Sr.No. Tên & Mô tả phương pháp
1

static Base64.Decoder getDecoder()

Trả về bộ mã hóa Base64.Decoder được giải mã bằng cách sử dụng lược đồ mã hóa base64 loại Cơ bản.

2

static Base64.Encoder getEncoder()

Trả về bộ mã hóa Base64.Encoder sử dụng lược đồ mã hóa base64 loại Cơ bản.

3

static Base64.Decoder getMimeDecoder()

Trả về Base64.Decoder giải mã bằng lược đồ giải mã base64 kiểu MIME.

4

static Base64.Encoder getMimeEncoder()

Trả về bộ mã hóa Base64.Encoder sử dụng lược đồ mã hóa MIME loại base64.

5

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

Trả về bộ mã hóa Base64.Encoder sử dụng lược đồ mã hóa loại MIME base64 với độ dài dòng được chỉ định và dấu phân cách dòng.

6

static Base64.Decoder getUrlDecoder()

Trả về một Base64.Decoder giải mã bằng lược đồ mã hóa base64 loại an toàn cho URL và Tên tệp.

7

static Base64.Encoder getUrlEncoder()

Trả về một Base64.Encoder mã hóa bằng lược đồ mã hóa base64 loại an toàn cho URL và Tên tệp.

Phương thức được kế thừa

Lớp này kế thừa các phương thức từ lớp sau:

  • java.lang.Object

Ví dụ Base64

Tạo chương trình Java sau bằng cách sử dụng bất kỳ trình soạn thảo nào bạn chọn trong C: /> JAVA.

Java8Tester.java

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

public class HelloWorld {

   public static void main(String args[]) {

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

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

Xác minh kết quả

Biên dịch lớp bằng cách sử dụng javac trình biên dịch như sau -

C:\JAVA>javac Java8Tester.java

Bây giờ hãy chạy Java8Tester như sau:

C:\JAVA>java Java8Tester

Nó sẽ tạo ra kết quả sau:

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