12/08/2018, 14:11

Sử dụng Stream API Java 8 với Android.

Bài viết gốc: http://onlyu.ga/home/android/su-dung-stream-api-java-8-voi-android.html Cùng với Lambda Expression thì Steam API trong Java 8 là một trong những tính năng mới và cực kì được các developer yêu thích. Nhưng tiếc là trên Android nó chỉ đượchỗ API 24 trở lên. Trong khi tìm kiếm ...

Bài viết gốc:

http://onlyu.ga/home/android/su-dung-stream-api-java-8-voi-android.html

Cùng với Lambda Expression thì Steam API trong Java 8 là một trong những tính năng mới và cực kì được các developer yêu thích. Nhưng tiếc là trên Android nó chỉ đượchỗ API 24 trở lên. Trong khi tìm kiếm tôi đã thấy một thư viện Stream API cho những Android phiên bản sdk thấp hơn 24.

Lightweight-Stream-API

LSA có hầu hết các api mà Stream API Java 8 có. Công việc của bạn là cài đặt nó, bằng cách mở build.gradle file và thêm vào dòng:

dependencies {
...
    compile 'com.annimon:stream:1.1.3'
...
}

Bấm sync now. Và chúng ta bắt đầu thử (Bạn nên đọc bài Lambda Expression trước khi đọc bài này vì dưới đây mình sử dụng Lambda expression).

Giả sử tôi có 1 danh sách Person

List<Person> people = new ArrayList<>();

Bây giờ tôi muốn in ra tên (Name) những người trong danh sách ấy. Bình thường ta sẽ làm như sau:

for(Person person : people){
    Log.i(TAG, person.Name);
}

Với Stream API:

Stream.of(people).forEach(person -> Log.e(TAG, person.Name));

Tôi có thể map Object Person sang String rồi sau đó mới log ra với hàm map như sau:

Stream.of(people).map(person -> person.Name).forEach(name -> Log.e(TAG, name));

Tôi chỉ muốn log ra những người có tuổi lớn hơn 20 tuổi thì sao. Ta đã có hàm filter.

Stream.of(people).filter(person -> person.Age>20).map(person -> person.Name).forEach(name -> Log.e(TAG, name));

Bây giờ tôi muốn có 1 list danh sách những tên có tuổi từ 20 tuổi trở lên. Ta sẽ dùng collect.

import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
....
List<Person> personList = Stream.of(people).filter(person -> person.Age>20).collect(Collectors.toList());

Với việc bạn sử dụng Collectors từ gói com.annimon.steam.Collectors của LSA. Tiếp nữa tôi sẽ tính tổng số tuổi của tất cả mọi người trong danh sách. Tôi dùng hàm reduce để tính.

int total = Stream.of(people).map(person -> person.Age).reduce(0, (x,y) -> x+y);
Log.e(TAG, "Tổng: " + total);

Giả sử danh sách kia không hề theo thứ tự. Bây giờ tôi muốn sắp xếp theo thứ tự từ người nhỏ tuổi đến người lớn tuổi.

Stream.of(people)
    .sorted((p1, p2) -> Integer.compare(p1.Age, p2.Age))
    .forEach(p -> Log.e(TAG, p.Name));

Và còn rất nhiều thứ hay ho khác mà đang chờ bạn khám phá tiếp.

Lời kết

Với việc hiện nay số lượng máy chạy Android N chưa nhiều thì việc sử dụng LSA để sử dụng Stream là điều đáng để bạn sử dụng và khám phá Stream trong Java 8.

Các bạn có thể xem thêm LSA ở đây:

https://github.com/aNNiMON/Lightweight-Stream-API

0