Trong hành trình trở thành một lập trình viên Java xuất sắc, việc hiểu và làm chủ Java Stream API là điều vô cùng cần thiết. Java Stream API cung cấp một cách tiếp cận mạnh mẽ và linh hoạt cho việc xử lý và phân tích dữ liệu trong Java, giúp bạn tối ưu hóa mã nguồn và cải thiện khả năng đọc hiểu của mã.
Trong bài viết này, chúng ta sẽ cùng nhau khám phá 15 bài tập thực hành về Java Stream API. Những bài tập này sẽ bắt đầu từ các phương thức cơ bản như filter và map, cho đến những kỹ thuật nâng cao như flatMap và reduce. Mỗi bài tập sẽ giúp bạn củng cố kiến thức và kỹ năng lập trình của mình bằng cách áp dụng vào các tình huống thực tế.
Chúng ta hãy bắt đầu hành trình này và khám phá những bài tập thực hành giúp bạn trở thành một bậc thầy trong việc sử dụng Java Stream API!
1. Giới thiệu về Java Stream API
Java Stream API là một phần quan trọng trong Java 8, được thiết kế để cung cấp cách xử lý và tổng hợp các tập dữ liệu theo kiểu khai báo và hàm. Sự ra đời của Java Stream API đã đơn giản hóa đáng kể logic mã, giảm số dòng mã cho nhiều tác vụ lập trình. Thay vì lặp qua từng phần tử trong danh sách hoặc mảng theo cách thông thường, Stream API hoạt động với luồng dữ liệu, cho phép bạn thêm một chuỗi thao tác vào luồng để đạt được mục tiêu mong muốn.
Luồng xử lý có thể được chia thành ba bước cơ bản:
- Tạo nguồn luồng (stream source).
- Thực hiện các thao tác trung gian (intermediate operations) để chuyển đổi luồng ban đầu thành luồng khác.
- Thực hiện thao tác cuối (terminal operation) để nhận kết quả và không thể sử dụng lại luồng.
Một pipeline trong Stream API bao gồm: 1 nguồn luồng, 0 hoặc nhiều thao tác trung gian và 1 thao tác cuối.
2. Khái Niệm Cơ Bản Về Java Stream API
Java Stream API không chỉ tạo điều kiện thuận lợi cho việc thao tác với dữ liệu mà còn hữu ích trong việc hợp nhất và tính toán. Hãy cùng xem một ví dụ đơn giản:
- Bài tập 1: Nhóm Nhân Viên Theo Chức Vụ
Với cách truyền thống sử dụng vòng lặp For, việc nhóm nhân viên sẽ diễn ra như sau:
java
public Map<String, List<Employee>> groupByJobTitle(List<Employee> employeeList) {
Map<String, List<Employee>> resultMap = new HashMap<>();
for (int i = 0; i < employeeList.size(); i++) {
Employee employee = employeeList.get(i);
List<Employee> employeeSubList = resultMap.getOrDefault(employee.getTitle(), new ArrayList<>());
employeeSubList.add(employee);
resultMap.put(employee.getTitle(), employeeSubList);
}
return resultMap;
}
- Với Stream API, ta có thể viết gọn gàng hơn:
java
public Map<String, List<Employee>> groupByJobTitle(List<Employee> employeeList) {
return employeeList.stream()
.collect(Collectors.groupingBy(Employee::getTitle));
}
Nhờ vào Stream API, mã nguồn trở nên ngắn gọn và dễ hiểu hơn.
3. 15 Bài Tập Thực Hành Java Stream API
Tiếp theo, chúng ta sẽ đi sâu vào 15 bài tập thực hành có liên quan đến mô hình dữ liệu như khách hàng, đơn hàng và sản phẩm. Các bài tập này sẽ từ cơ bản đến nâng cao, giúp bạn củng cố kiến thức về Stream API.
Bài Tập 1: Lấy Các Sản Phẩm Thuộc Danh Mục "Books" Có Giá Trên 100
java
List<Product> result = productRepo.findAll()
.stream()
.filter(p -> p.getCategory().equalsIgnoreCase("Books"))
.filter(p -> p.getPrice() > 100)
.collect(Collectors.toList());
Như vậy, ta đã có điều kiện lọc sản phẩm theo danh mục và giá.
Bài Tập 2: Danh Sách Đơn Hàng Có Sản Phẩm "Baby"
java
List<Order> result = orderRepo.findAll()
.stream()
.filter(o -> o.getProducts().stream().anyMatch(p -> p.getCategory().equalsIgnoreCase("Baby")))
.collect(Collectors.toList());
Bài Tập 3: Giảm Giá 10% Cho Các Sản Phẩm Trong Danh Mục "Toys"
java
List<Product> result = productRepo.findAll()
.stream()
.filter(p -> p.getCategory().equalsIgnoreCase("Toys"))
.map(p -> p.withPrice(p.getPrice() * 0.9))
.collect(Collectors.toList());
Để tiếp tục, bạn sẽ thực hiện các bài tập còn lại, từ việc lọc sản phẩm, nhóm dữ liệu, cho đến các phép tính phức tạp như tổng, trung bình, và tạo các Map.`
4. Lời Kết
Những bài tập cùng với các ví dụ thực tế trên sẽ giúp bạn hiểu rõ hơn về cách sử dụng Java Stream API trong việc xử lý và phân tích dữ liệu một cách hiệu quả. Các kỹ năng này sẽ trở nên vô cùng hữu ích khi bạn đối mặt với những bài toán phức tạp hơn trong thực tế. Hãy luyện tập thường xuyên để sử dụng Java Stream API một cách thành thạo!
Hãy cùng chia sẻ trải nghiệm của bạn với những bài tập này trong phần bình luận nhé!
source: viblo