Java 9: Stream API và private method trong Interface

Java 9 vừa được release với khá nhiều tính năng rất cool. Trong khuôn khổ bài viết này tôi sẽ chia sẻ với mọi người về 2 phần (trong khá nhiều phần) là Stream và Interface. Hãy cùng xem có gì mới nào 😃

Stream

Java 8 giới thiệu Streams, giúp các developer thực hiện các hoạt động tổng hợp từ một chuỗi các đối tượng. Trong khi đó, Java 9 giới thiệu một vài method hữu ích để làm cho các developer làm việc dễ dàng hơn.

Stream takewhile and dropwhile

Takewhile sẽ lấy tất cả các giá trị cho đến khi vị từ trả về false. Trong khi đó, dropwhile sẽ thả tất cả các giá trị cho đến khi vị từ thất bại.

Các method util để filter trong Java 8 sẽ giữ lại tất cả các yếu tố khi nó phù hợp với điều kiện. Tuy nhiên, sẽ có một khi nó đã tìm ra một phần tử mà nó không khớp được, như Stream bao gồm tiền tố dài nhất của các phần tử lấy từ phần này Stream phù hợp với vị từ nhất định (Stream đã được sắp xếp). Dropwhile sẽ vứt bỏ các phần tử ở đầu nơi vị từ là đúng. Ví dụ: nó trả về Stream bao gồm các phần tử còn lại của Stream sau khi thả tiền tố dài nhất của các phần tử khớp với vị từ đã cho (Stream đã được sắp xếp).

Trong trường hợp không có thứ tự, cả hai trả về tập con của các phần tử theo định nghĩa của chúng.

Ví dụ: https://images.viblo.asia/f755ea8c-95fd-41d3-afba-00c346805ee7.jpeg Trong ví dụ trên, takewhile sẽ lấy tất cả các giá trị 'abc', sau đó tìm thấy rằng chuỗi là rỗng, do đó, nó ngừng thực hiện nó. Sau đó, dropwhile bỏ 'abc', sau đó lấy tất cả các giá trị phù hợp với điều kiện.

Stream iterate

Stream có method iterate với hai đối số: Một là initializer, hai là seed, và đối số khác là hàm được áp dụng cho phần tử trước để tạo ra các yếu tố mới. Nhưng nhược điểm của method này là không có sự kết thúc của vòng lặp đó.

Ví dụ:

Stream.iterate(1, count->count+2 ).forEach(System.out::println);

Đoạn code trên sẽ tiếp tục thực hiện và không bao giờ ngừng.

Java 9

Java 9 cập nhật method iterate, tương tự như những gì chúng ta đã có trước đó cho các vòng lặp dựa trên lặp. Đây là sự thay thế cho các vòng lặp. Điều này cũng giải quyết vấn đề mà chúng ta đã gặp phải trong method iterate cũ.

iterate(initialize section; predicate section(hasNext); next section)

Các iterate sẽ dừng lại một khi phần hasNext trả về false.

Ví dụ:

Trong ví dụ trên, giá trị được khởi tạo bằng 3 và gia số mỗi lần bằng 3. Điều kiện là giá trị phải nhỏ hơn 10. Vì vậy, đầu ra là 3, 6, 9.

Stream ofNullable

Java 9 đã giới thiệu phương thứcNullable để trả về Optionals rỗng nếu giá trị là null. Mục đích chính là tránh NullPointerExceptions và để tránh kiểm tra null ở mọi nơi.

Ở đây, nó trả về Stream tuần tự chứa một phần tử nếu giá trị không phải là null - nếu không, nó trả về Stream rỗng.

Ví dụ: Đoạn dưới đây sẽ cho thấy việc sử dụng nullable để tránh NullPointerExceptions.

Hãy xem xét một ví dụ thực tế hơn tí, khi chúng ta phải tìm employee và sau đó list roles của employee đó.

Java 8

Employee emp= getEmployee(empId);
Stream<Roles> roles= emp== null? Stream.empty(): emp.roles();

Trong trường hợp trên, method getEmployee có thể trả về null, vì vậy chúng ta đã thực hiện kiểm tra null và thực hiện các thao tác sau đó.

Java 9

Employee emp= getEmployee(empId);
Stream.ofNullable(emp).flatMap(Employee::roles)

Ở ví dụ Java 9 chúng ta có thể sử dụng util ofNullable để giảm số dòng code của chúng ta.

Private Methods trong Interface

Có gì hot?

Trong Java 9 và phiên bản mới hơn, Interface có thể có sáu thuộc tính sau:

  1. Constant variables
  2. Abstract methods
  3. Default methods
  4. Static methods
  5. Private methods
  6. Private Static methods

Trong danh sách này có private methods và private static methods là hai thứ mới được thêm vào bản release này.

Ví dụ:

public interface CustomInterface {
     
    public abstract void method1();
     
    public default void method2() {
        method4();  //private method inside default method
        method5();  //static method inside other non-static method
        System.out.println("default method");
    }
     
    public static void method3() {
        method5(); //static method inside other static method
        System.out.println("static method");
    }
     
    private void method4(){
        System.out.println("private method");
    }
     
    private static void method5(){
        System.out.println("private static method");
    }
}

Rules

Nếu muốn viết private method trong interface, ta cần follow vài rule sau:

  1. Chúng ta NÊN sử dụng private modifier
  2. Không có chuyện private và abstract modifier cùng nhau, nếu không sẽ có compile error Nó không có gì mới ở đây cả.
    • private method có nghĩa là method thực hiện đầy đủ bởi vì các sub-class không thể kế thừa và override lên method này.
    • abstract method có nghĩa là non-implementation, và ở sub-class nó phải được kế thừa và override.
  3. Private method phải có nội dung bên trong body.
  4. Private modifier là thấp nhất (quá obvious rồi @@).

Tại sao nên dùng private method trong Interface

Java 9 private method có các benefit sau:

  1. Tránh được duplicate code.
  2. Chúng ta sẽ có thêm lựa chọn là chỉ để lộ các method dự định triển khai của chúng ta cho khách hàng.

All Rights Reserved