Kể từ Java 8, chúng ta có thể chuyển đổi một đối tượng Java sang kiểu dữ liệu khác sử dụng phương thức map() của đối tượng Stream với Lambda Expression. Trong bài viết này, mình sẽ trình bày với các bạn một số ví dụ để làm điều này.
Trước tiên, các bạn cần biết là, phương thức map() là một intermediate operation nên chúng ta sẽ cần thêm phương thức đóng vai trò là terminal operation để hoàn thành Stream pipeline. Các bạn xem thêm về đối tượng Stream ở đây để hiểu rõ hơn nhé.
Ví dụ đầu tiên, chúng ta sẽ chuyển đổi một List của String dưới dạng chữ thường sang List của String dưới dạng viết hoa sử dụng phương thức map().
Trước Java 8, chúng ta có thể chuyển đổi như sau:
1 2 3 4 5 6 7 8 9 10 11 |
List<String> names = new ArrayList<>(); names.add("Thanh"); names.add("Khanh"); names.add("Tan"); List<String> namesUpper = new ArrayList<>(); for (String s : names) { namesUpper.add(s.toUpperCase()); } System.out.println(namesUpper.toString()); |
Kết quả:
Nếu bây giờ, các bạn viết lại đoạn code trên sử dụng phương thức map() của đối tượng Stream với Lambda Expression từ Java 8:
1 2 3 4 5 6 7 8 9 |
List<String> names = new ArrayList<>(); names.add("Thanh"); names.add("Khanh"); names.add("Tan"); List<String> namesUppper = names.stream() .map(x -> x.toUpperCase()) .collect(Collectors.toList()); System.out.println(namesUppper); |
thì kết quả vẫn như vậy.
Ví dụ thứ 2 mà mình muốn đề cập ở đây đó là chúng ta có thể extract một số thông tin từ đối tượng này tới đối tượng khác sử dụng phương thức map().
Ví dụ, mình có class Student như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package com.huongdanjava.javaexample; import java.util.Date; public class Student { private String name; private Date dateOfBirth; public Student(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getDateOfBirth() { return dateOfBirth; } public void setDateOfBirth(Date dateOfBirth) { this.dateOfBirth = dateOfBirth; } } |
Bây giờ, mình có thể extract thông tin tên của tất cả sinh viên thành danh sách tên như sau:
1 2 3 4 5 6 7 8 9 |
List<Student> students = Arrays.asList( new Student("Khanh"), new Student("Thanh"), new Student("Tan")); List<String> names = students.stream() .map(s -> s.getName()) .collect(Collectors.toList()); System.out.println(names); |
Trong ví dụ trên, biến s đại diện cho mỗi đối tượng Student trong danh sách sinh viên, do đó, các bạn có thể lấy được tên sinh viên để put vào danh sách tên sinh viên.
Kết quả:
chumeo
Hi anh cho em hỏi khi sử dụng stream có nàng đc performance hơn so với dùng for thông thường ko ạ
Khanh Nguyen
Rất tiếc là không em ơi, em làm thử ví dụ sẽ biết ngay mà!