images
08/10/2020 07:05 am

Java Lambda và Stream với list

Từ Java 8, Lambda đã được đưa vào ngôn ngữ Java. Lambda giúp cho đoạn code thực thi được trình bày gọn hơn, giảm thời gian code của lập trình viên.

Thay vì các vòng loop với for và while, code của bạn sẽ ngắn hơn nhiều và vì thế sẽ ít lỗi hơn. Ngoài ra có khá nhiều các hàm được built-in trong ngôn ngữ này nên rất tiện dụng.


Dưới đây là những ứng dụng hàm Lambda và Stream trong Java để làm việc với list:


1. Filter


Lọc ra các phần tử mong muốn: Lấy tập hợp các phần tử lớn hơn 5.


List<Integer> list = Arrays.asList(1, 4, 5, 7, 8, 9);

List<Integer> filters = list.stream().filter(p -> p > 5).collect(Collectors.toList());


Kết quả: [7, 8, 9]


List<Integer> filters = list.stream().filter(p -> p > 15).collect(Collectors.toList());


Kết quả: Mảng rỗng []


2. Tìm phần tử


Tìm phần tử đầu tiên trong danh sách lớn hơn 5.


List<Integer> list = Arrays.asList(1, 4, 5, 7, 8, 9);

Optional<Integer> s = list.stream().filter(p -> p > 5).findFirst();

if (s.isPresent()) {

   System.out.println(s.get());

}


Lưu ý, kết quả trả về là một Optional. Optional để chỉ ra rằng kết quả trả về có thể có hoặc không có giá trị. Java đưa ra kiểu dữ liệu này nhằm tránh những lỗi như NullPointerException khi lấy kết quả không tồn tại. Lúc này để lấy kết quả bạn phải kiểm tra isPresent trước khi lấy giá trị qua hàm get.


Kết quả: 7


3. Sum


Tính tổng các thành phần của mảng.


Ở đây bạn dùng hàm reducer, cho phép tạo kết quả từ 2 phần tử trong mảng. Kết quả này được cộng liên tục thành số tổng như sau:


List<Integer> list = Arrays.asList(1, 4, 5, 7, 8, 9);

Integer sum = list.stream().reduce((a, b) -> a + b).get();



Kết quả: 34


4. Count


Đếm số phần tử trong mảng có giá trị lớn hơn 4:


long count = list.stream().filter(p -> p > 4).count();



Kết quả: 4


5. Remove element in List


Phép toán remove trên một list sẽ làm thay đổi bản thân list.



List<Integer> list = new ArrayList<>();

list.add(1);

list.add(4);

list.add(5);

list.add(6);

list.removeIf(p -> p > 5);



Kết quả sau khi remove, list = [1,2,5]


6. Min, Max


Tìm giá trị nhỏ nhất hay lớn nhất của mảng:



List<Integer> list = Arrays.asList(1, 4, 5, 7, 8, 9);
Optional<Integer> min = list.stream().min(Comparator.comparingInt(a -> a));

Optional<Integer> max = list.stream().max(Comparator.comparingInt(a -> a));


Kết quả: min = 1, max = 9


7. Sắp xếp


Thay vì phương pháp dùng thuật toán bubble sort bạn có thể dùng các câu lệnh sau:


List<Integer> list = Arrays.asList(11, 4, 10, 7, 48, 29);

Collections.sort(list);

Hoặc

list.sort((a, b) -> a - b);  

// a - b > 0: a dung sau b

// a - b < 0: a dung truoc b => b - a > 0  


Kết quả: [4, 7, 10, 11, 29, 48]


Sắp xếp với danh sách một đối tượng: Ở phần này chúng ta sẽ làm nâng cao hơn một chút với việc sắp xếp một mảng Person với chiều cao tăng dần. 



Sắp xếp với hàm Lambda so sánh chiều cao như sau:


people.sort(Comparator.comparingInt(p -> p.getHeight()))


hoặc ngắn gọn hơn: 


Comparator.comparingInt(Person::getHeight)



Kết quả: [Person height:150, Person height:160, Person height:175, Person height:182]


8. Lọc phần tử 


Lọc phần tử để tạo ra mảng gồm các phần tử duy nhất không bị lặp lại: Giả sử ta có mảng các phần tử sau: 1,2,3,3,5,6,6,7. Ta cần lọc bỏ các phần tử trùng để tạo thành mảng không trùng: 1,2,3,5,6,7 ta dùng hàm distinct() như sau:



9. Map


Nhờ stream và Lambda, bạn có thể dễ dàng convert dữ liệu từ kiểu X sang kiểu Y. Ví dụ nếu muốn tạo ra một mảng dữ liệu về chiều cao từ mảng People ta làm như sau:


List<Integer> heights = people.stream().mapToInt(p -> p.getHeight()).boxed().collect(Collectors.toList());


Ở đây ta dùng hàm boxed để chuyển một IntStream thành Stream<Integer> trước khi collect thành mảng.

Ngoài ra bạn có thể tính tổng chiều cao của các phần tử trong mảng như sau:


people.stream().mapToInt(p -> p.getHeight()).sum();


10. FlatMap


Được dùng khi ta muốn chuyển đổi kiểu dữ liệu từ mảng của các mảng về 1 mảng tổng hợp. Ví dụ:


Mời các bạn đọc thêm bài Tại sao cần dùng Java annotation?


- Tech Zone -

Thư giãn chút nào!!!

Bài viết liên quan