Mục lục
Hẳn rằng khi lập trình chúng ta phải giải quyết rất nhiều bài toán để có được kết quả mong muốn. Và nếu các bạn nhìn lại một chút thì sẽ toá hoả rằng chúng ta sẽ dụng rất nhiều các collection để lưu trữ và xử lý dữ liệu.
List<String> courses = new ArrayList<>(); ArrayList<Integer> ids = new ArrayList<>();
Các bạn đã sử dụng quá quen thuộc với hai dòng code ở trên?
Các bạn đã sử dụng chúng rất nhiều trong các bài tập ở trường?
Vậy có bao giờ các bạn tự hỏi liệu hai cách viết trên có khác nhau gì không?
Trước khi trả lời câu hỏi trêm, chúng ta sẽ xem sơ qua một chút khái niệm về collection trong java.
Collections trong java
Collection trong java là một famework cung cấp các kiến trúc để lưu trữ và sử dụng một nhóm các đối tượng.
Trước khi collection được giới thiệu, Để nhóm các đối tượng trong java chúng ta có Arrays, Vectors hay là HashTables.
Với mỗi loại trên chúng ta sẽ có các cách thêm và truy cập khác nhau, chúng lại không các interface chung khiến cho các java dev lúc bấy giờ cảm thấy khó chịu.
Một hạn chế nữa các method trong ‘Vector’ là final, hiểu đơn giản là bạn sẽ không thể extend ‘Vector’ class để implement các collection tương tự.
Để giải quyết các rắc rối trên, các nhà phát triển java đã cho ra đời Collection Framework trong bản JDK 1.2.
Hệ thống phân cấp của Collection Framework
Nhìn sơ đồ trên có lẽ chúng ta sẽ thật sự choáng ngợp, thật ra mình cũng vậy. Thế nhưng các bạn đừng lo, hãy xem sơ đồ này như bức tranh toàn cảnh. Chúng ta sẽ đi tìm hiểu những collection hay dùng nhất, sau đó mới tính đến máy cái kia nha.
Giới thiệu sơ một xíu.
Collection là một interface với những method căn bản như: add(), remove(), contains(), isEmpty(), addAll(), … etc.
Collection interface java.util.Collection và Map interface java.util.Map là 2 thành phần chính khác nhau, =) cái này mình thấy phỏng vấn người ta hay hỏi.
Như vậy, với việc các class khác như HashSet, ArrayList etc, mặc dù chúng có các đặc thù riêng nhưng chắc rằng chúng sẽ có các method như trên bởi vì chúng đều implement từ collection interface.
List: là một danh sách các phần tử có thứ tự, List có thể chứa hai hoặc nhiều các phần tử giống nhau.
Set: Là một danh chứa các phần tử không có thứ tự, và không cho phép các phần tử trùng nhau.
Map: Lưu trữ các phần tử theo cặp giá trị (key, value), không cho phép có cặp key trùng nhau.
Queue: Lưu các phần tử theo công thứ FIFO (First In First Out).
Collection với Stream API
Stream API được xem là trái tim trong các cú pháp của Java, nếu các bạn có cơ hội làm việc với các dự án Java được tạo từ Java 8 trở đi các bạn sẽ thấy gần như Stream API có mặt ở khắp mọi nơi. Không những hỗ trợ mạnh mẽ các thao tác thông hằng ngày như duyệt collection, lọc dữ liệu, sắp xếp, ánh xạ dữ liệu, cú pháp trong Stream API cũng vô cùng dễ chịu giúp cho việc đọc hiểu mã nguồn dễ dàng hơn.
Một Stream API hoạt động trên 1 collection sẽ trải qua 3 đoạn chính:
- Khởi tạo Stream
- Hoạt động trung gian – Intermediate Operations
- Hoạt động đầu cuối – Terminal Operations
Trong đó các hoạt động trung gian thao tác trên dữ liệu phù hợp các nhu cầu mà chúng ta cần nhứ sắp xếp, lọc, ánh xạ. Cuối cùng hoạt động đầu cuối sẽ nhận các dữ liệu từ hoạt động trung gian để thao tác ví dụ như duyệt, tính tổng các số nguyên, rút trích dữ liệu.
Dưới đây là một ví dụ sử dụng Stream API với Set và List/
import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; class Main { public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7); Set<String> set = new HashSet<>(); set.add("1"); set.add("2");set.add("3"); set.add("4"); int sum = list.stream() .filter(value -> value > 0) .mapToInt(value -> value) .sum(); set.stream().forEach(s -> System.out.println(s)); System.out.println(sum); } }
Phần kết
Đến đây, thì có lẽ chúng ta sẽ dễ dàng trả lời câu hỏi ở đầu bài rồi phải không nào? Chúng ta có ArrayList implements <interface> List. thế nên hai cách khai báo ở trên là hoàn toàn hợp lệ. Nhưng mình khuyên nên dùng cách (1)
List<String> courses = new ArrayList<>();
Vì nó thể hiện rõ phong cách hướng đối tượng của java. Chúng ta có thể linh động hơn trong việc tạo các collection khác nhau implement từ interface List.
List<String> arrayList = new ArrayList<>(); List<String> linkedList = new LinkedList<>(); List<StrictMath> vector = new Vector<>();