Tin tức và phân tích của tất cả các thiết bị di động

Cách tìm hiểu API Java Stream [+5 Resources]

Luồng trong Java là một chuỗi các phần tử mà trên đó các hoạt động tuần tự hoặc song song có thể được thực hiện.

Có thể có ‘n’ thao tác trung gian và cuối cùng là thao tác cuối cùng sau đó kết quả được trả về.

Luồng là gì?

Các luồng có thể được quản lý bằng API luồng, được giới thiệu trong Java 8.

Hãy tưởng tượng Stream như một đường ống sản xuất nơi một số hàng hóa cần được sản xuất, phân loại và sau đó đóng gói để vận chuyển. Trong Java, những hàng hóa này là các đối tượng hoặc tập hợp các đối tượng, các hoạt động là sản xuất, phân loại và đóng gói, còn đường ống là một luồng.

Các thành phần luồng là:

  • Trước khi vào
  • Hoạt động gián tiếp
  • Hỗ trợ thiết bị đầu cuối
  • Điểm cuối cùng

Hãy xem xét một số tính năng của luồng trong Java:

  • Luồng không phải là cấu trúc dữ liệu trong bộ nhớ; đúng hơn, nó là một chuỗi các mảng, đối tượng hoặc tập hợp các đối tượng mà các phương thức cụ thể hoạt động trên đó.
  • Các luồng mang tính khai báo, tức là bạn chỉ định những việc cần làm nhưng không chỉ định cách thực hiện.
  • Chúng chỉ có thể được tiêu thụ một lần vì chúng không được lưu trữ ở bất cứ đâu.
  • Luồng không sửa đổi cấu trúc dữ liệu gốc; nó chỉ rút ra một cấu trúc mới từ nó.
  • Trả về kết quả cuối cùng từ phương thức cuối cùng trong đường ống.

Stream API và xử lý bộ sưu tập

Bộ sưu tập là cấu trúc dữ liệu trong bộ nhớ để lưu trữ và xử lý dữ liệu. Bộ sưu tập cung cấp các cấu trúc dữ liệu như tập hợp, bản đồ, danh sách, v.v. để lưu trữ dữ liệu. Mặt khác, luồng là một cách để truyền dữ liệu hiệu quả sau khi nó được xử lý bằng đường ống.

Đây là một ví dụ về bộ sưu tập ArrayList: –

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(0, 3);
        System.out.println(list);
    }
}

Output: 
[3]

Như bạn có thể thấy trong ví dụ trên, bạn có thể tạo một bộ sưu tập ArrayList, lưu trữ dữ liệu trong đó và sau đó thao tác với dữ liệu đó bằng nhiều phương pháp khác nhau.

Với luồng, bạn có thể thao tác trên cấu trúc dữ liệu hiện có và trả về giá trị mới, được sửa đổi. Dưới đây là ví dụ về cách tạo bộ sưu tập ArrayList và lọc nó bằng một luồng.

import java.util.ArrayList;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList();

        for (int i = 0; i < 20; i++) {
            list.add(i+1);
        }

        System.out.println(list);

        Stream<Integer> filtered = list.stream().filter(num -> num > 10);
        filtered.forEach(num -> System.out.println(num + " "));
    }
}

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

Trong ví dụ trên, một luồng được tạo bằng danh sách hiện có và danh sách được lặp lại để lọc ra các giá trị lớn hơn 10. Lưu ý rằng luồng không lưu trữ bất cứ thứ gì, danh sách chỉ được lặp lại và kết quả được in. Nếu bạn cố in một luồng, bạn sẽ nhận được một tham chiếu luồng thay vì một giá trị.

Làm việc trên API luồng Java

API Java Stream lấy một tập hợp nguồn gồm các phần tử hoặc một chuỗi các phần tử rồi thực hiện các thao tác trên chúng để tạo ra kết quả cuối cùng. Luồng chỉ đơn giản là một đường ống mà một chuỗi các phần tử đi qua và được biến đổi theo một cách nào đó.

Một luồng có thể được tạo từ nhiều nguồn khác nhau, bao gồm:

  • Một bộ sưu tập, chẳng hạn như danh sách hoặc bộ.
  • Cái bảng.
  • Từ các tập tin và đường dẫn của chúng bằng bộ đệm.

Có hai loại hoạt động truyền phát: –

  • Hoạt động gián tiếp
  • Hoạt động của nhà ga

Hoạt động trung gian và thiết bị đầu cuối

Mỗi thao tác trung gian trả về nội bộ một luồng mới biến đổi đầu vào bằng phương thức đã chỉ định. Trong thực tế, không có gì được đi qua; Thay vào đó, nó được chuyển sang luồng tiếp theo. Chỉ trong quá trình vận hành thiết bị đầu cuối, luồng đi qua mới đạt được kết quả mong muốn.

Ví dụ: bạn có một danh sách gồm 10 số mà bạn muốn lọc ra và sau đó ánh xạ tới một số nào đó. Không phải mọi mục trong danh sách đều sẽ được xem xét ngay lập tức để có kết quả được lọc và ánh xạ nó tới mục khác. Thay vào đó, các phần tử riêng lẻ sẽ được kiểm tra và nếu chúng đáp ứng điều kiện, chúng sẽ được ánh xạ. Luồng mới cho từng mục.

Thao tác trên bản đồ sẽ được thực hiện trên từng phần tử riêng lẻ đáp ứng tiêu chí lọc chứ không phải trên toàn bộ danh sách. Và trong quá trình vận hành thiết bị đầu cuối, chúng được xem xét và kết hợp thành một kết quả duy nhất.

Sau khi thực hiện thao tác đầu cuối, luồng sẽ bị tiêu thụ và không thể sử dụng được nữa. Bạn cần tạo luồng mới để thực hiện lại các thao tác tương tự.

nguồn: The Bored Dev

Với sự hiểu biết sơ sài về cách hoạt động của các luồng, hãy đi sâu vào chi tiết về cách triển khai các luồng trong Java.

# 1. Một luồng trống

Tạo luồng trống bằng phương thức trống của API luồng.

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream emptyStream = Stream.empty();
        System.out.println(emptyStream.count());
    }
}

Output:
0

Ở đây nếu bạn in số lượng mục trong luồng này, bạn sẽ nhận được 0 kết quả là vì đó là một luồng trống không có phần tử nào. Các luồng trống rất hữu ích trong việc tránh các ngoại lệ con trỏ null.

#2. Truyền phát từ bộ sưu tập

Các bộ sưu tập như Danh sách và Bộ cung cấp phương thức luồng() cho phép bạn tạo luồng từ bộ sưu tập. Luồng đã tạo sau đó có thể được duyệt qua để đạt được hiệu ứng cuối cùng.

ArrayList<Integer> list = new ArrayList();

for (int i = 0; i < 20; i++) {
    list.add(i+1);
}

System.out.println(list);

Stream<Integer> filtered = list.stream().filter(num -> num > 10);
filtered.forEach(num -> System.out.println(num + " "));

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

#3. Truyền phát từ mảng

Phương thức Arrays.stream() tạo một luồng từ một mảng.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] stringArray = new String[]{"this", "is", "newsblog.pl"};
        Arrays.stream(stringArray).forEach(item -> System.out.print(item + " "));
    }
}

#Output

this is newsblog.pl 

Bạn cũng có thể chỉ định chỉ mục bắt đầu và kết thúc của các thành phần mà bạn muốn tạo luồng từ đó. Chỉ mục bắt đầu là bao gồm trong khi chỉ mục cuối là độc quyền.

String[] stringArray = new String[]{"this", "is", "newsblog.pl"};
Arrays.stream(stringArray, 1, 3).forEach(item -> System.out.print(item + " "));

Output:
is newsblog.pl

#4. Tìm số tối thiểu và tối đa với luồng

Số lượng tối đa và tối thiểu của một bộ sưu tập hoặc mảng có thể được truy cập bằng cách sử dụng các bộ so sánh trong Java. Các phương thức min() và max() chấp nhận một bộ so sánh và trả về một đối tượng Tùy chọn.

Đối tượng tùy chọn là đối tượng chứa có thể chứa hoặc không chứa giá trị khác null. Nếu nó chứa giá trị khác null, việc gọi get() trên đó sẽ trả về một giá trị.

import java.util.Arrays;
import java.util.Optional;

public class MinMax {
    public static void main(String[] args) {
        Integer[] numbers = new Integer[]{21, 82, 41, 9, 62, 3, 11};

        Optional<Integer> maxValue = Arrays.stream(numbers).max(Integer::compare);
        System.out.println(maxValue.get());

        Optional<Integer> minValue = Arrays.stream(numbers).min(Integer::compare);
        System.out.println(minValue.get());
    }
}

#Output
82
3

Phương pháp giáo dục

Bây giờ bạn đã hiểu cơ bản về các luồng trong Java, đây là 5 tài nguyên để giúp bạn thành thạo Java 8:

# 1. Java 8 đang hành động

Cuốn sách này là hướng dẫn về các tính năng Java mới 8bao gồm các luồng, biểu thức lambda và lập trình kiểu chức năng. Ngoài ra, một phần của cuốn sách còn có các câu hỏi trắc nghiệm và câu hỏi kiểm tra kiến ​​thức giúp bạn ôn lại những gì đã học.

Bạn có thể mua cuốn sách này ở định dạng bìa mềm cũng như ở định dạng sách nói tại Amazon.

#2. Java 8 Lambdas: lập trình chức năng cho đại chúng

Cuốn sách này được thiết kế đặc biệt để hướng dẫn các nhà phát triển Java SE cấp đầu vào về cách việc thêm biểu thức Lambda ảnh hưởng đến ngôn ngữ Java. Nó bao gồm các giải thích trôi chảy, bài tập mã và ví dụ để nắm vững các biểu thức lambda Java 8.

Nó có sẵn ở dạng bìa mềm và phiên bản Kindle TRÊN Amazon.

#3. Java SE 8 dành cho những người thực sự thiếu kiên nhẫn

Nếu bạn là nhà phát triển Java SE có kinh nghiệm, cuốn sách này sẽ hướng dẫn bạn những cải tiến được thực hiện trong Java SE 8API Stream, bổ sung các biểu thức lambda, cải tiến lập trình đồng thời Java và một số tính năng Java 7mà hầu hết mọi người không biết. Tôi không biết về.

Nó chỉ có ở dạng giấy Amazon.

#4. Tìm hiểu lập trình chức năng trong Java với lambdas và luồng

Khóa học Udemy này bao gồm các kiến ​​thức cơ bản về lập trình hàm trong Java 8 Và 9. Biểu thức Lambda, tham chiếu phương thức, luồng và giao diện chức năng là những khái niệm mà khóa học này tập trung vào.

Nó cũng bao gồm một số câu đố và bài tập Java liên quan đến lập trình hàm.

#5. Thư viện lớp Java

Thư viện lớp Java là một phần của Chuyên ngành Java cốt lõi do Coursera cung cấp. Nó sẽ dạy bạn cách viết mã an toàn kiểu bằng cách sử dụng Java Generics, hiểu thư viện lớp của hơn 4.000 lớp, làm việc với các tệp và xử lý các lỗi thời gian chạy. Tuy nhiên, có một số điều kiện tiên quyết để tham gia khóa học này:

  • Giới thiệu về Java
  • Giới thiệu về lập trình hướng đối tượng trong Java
  • Hệ thống phân cấp hướng đối tượng trong Java

những từ cuối

API Java Stream và giới thiệu các hàm Lambda trong Java 8 nó đơn giản hóa và cải thiện nhiều thứ trong java như lặp song song, giao diện chức năng, ít mã hơn, v.v.

Tuy nhiên, các luồng có một số hạn chế; hạn chế lớn nhất của chúng là chúng chỉ có thể được tiêu thụ một lần. Nếu bạn là nhà phát triển Java, các tài nguyên được liệt kê ở trên có thể giúp bạn hiểu các chủ đề này chi tiết hơn, vì vậy hãy nhớ duyệt qua chúng.

Bạn cũng có thể muốn biết về cách xử lý ngoại lệ trong Java.