Khi làm việc với ArrayList, chúng ta có rất nhiều nhu cầu như tìm kiếm, rút trích dữ liệu. Để đơn giản hoá, stream api cung cấp cơ chế filter giúp các thao tác rút trích và tìm kiếm dữ liệu trở nên hiệu quả hơn.
Để đi sâu bài này, mình vẫn xin suggest các bạn tìm hiểu qua Stream api là gì? đã nhé.
Syntax:
public final Stream<P_OUT> filter(Predicate<? super P_OUT> predicate)
Cho class Income được áp dụng cho các ví dụ bên dưới như sau
//File Income.java import java.time.LocalDate; public class Income { private String sender; private String receiver; private double money; private LocalDate date; public Income(String sender, String receiver, double money, LocalDate date) { this.sender = sender; this.receiver = receiver; this.money = money; this.date = date; } public String getSender() { return sender; } public String getReceiver() { return receiver; } public double getMoney() { return money; } public LocalDate getDate() { return date; } @Override public String toString() { return "Income{" + "sender='" + sender + '\'' + ", receiver='" + receiver + '\'' + ", money=" + money + ", date=" + date + '}'; } }
Search ArrayList với stream api filter
Tìm kiếm là một công việc mà chúng ta thường thao tác rất nhiều với ArrayList. Dưới đây mình sẽ lấy ví dụ để xem tìm kiếm với filter như thế nào.
Ngân hàng nhà nước lưu thông tin thu nhập hàng tháng của mỗi người lao động với những thông tin sau: Tên người gửi(có thể là tên công ty), tên người nhận, số tiền gửi, thời gian gửi(ngày, tháng năm)
1, Tìm tất cả các thông tin gửi tiền của công ty ELCA(tên người gửi)
2, Tìm tất cả các thông tin giao dịch vào ngày 01-01-2019
import java_regex.Income; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Income> arr = new ArrayList<>(); arr.add(new Income("ELCA", "HGA", 20000000, LocalDate.of(2019, 1, 1))); arr.add(new Income("KMS", "VVH", 100000000, LocalDate.of(2019, 1, 1))); arr.add(new Income("ELCA", "AKG", 200000000, LocalDate.of(2019, 5, 1))); arr.add(new Income("FPT", "FGH", 1000000, LocalDate.of(2019, 9, 1))); System.out.println("Thong tin gui tien cua cong ty ELCA"); List<Income> imcomes1 = arr.stream().filter(i -> i.getSender().equals("ELCA")) .collect(Collectors.toList()); imcomes1.forEach(i -> System.out.println(i.toString())); System.out.println("------------------------------------------------"); System.out.println("Thong tin cac giao dich ngay 01-01-2019"); List<Income> imcomes2 = arr.stream().filter(i -> i.getDate().equals(LocalDate.of(2019, 1, 1))) .collect(Collectors.toList()); imcomes2.forEach(i -> System.out.println(i.toString())); } }
Output:
Thong tin gui tien cua cong ty ELCA
Income{sender=’ELCA’, receiver=’HGA’, money=2.0E7, date=2019-01-01}
Income{sender=’ELCA’, receiver=’AKG’, money=2.0E8, date=2019-05-01}
————————————————
Thong tin cac giao dich ngay 01-01-2019
Income{sender=’ELCA’, receiver=’HGA’, money=2.0E7, date=2019-01-01}
Income{sender=’KMS’, receiver=’VVH’, money=1.0E8, date=2019-01-01}
Note: Giả sử một thuộc tính trong object mà chúng ta áp dụng filter bị null, thì chúng ta sẽ bị NullPointerException. Để tránh trường hợp trên, chúng ta có thể filter trước các trường hợp null hoặc kết hợp điều kiện khác null.
import java_regex.Income; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Income> arr = new ArrayList<>(); arr.add(new Income("ELCA", "HGA", 20000000, LocalDate.of(2019, 1, 1))); arr.add(new Income(null, "VVH", 100000000, LocalDate.of(2019, 1, 1))); arr.add(new Income("ELCA", "AKG", 200000000, LocalDate.of(2019, 5, 1))); arr.add(new Income("FPT", "FGH", 1000000, LocalDate.of(2019, 9, 1))); // Filter truoc cac gia tri null List<Income> imcomes1 = arr.stream() .filter(i -> i.getSender() != null) .filter(i -> i.getSender().equals("ELCA")).collect(Collectors.toList()); imcomes1.forEach(i -> System.out.println(i.toString())); System.out.println("-----------------------------------------------"); // Ket hop dieu kien null List<Income> imcomes2 = arr.stream() .filter(i -> i.getSender() != null && i.getSender().equals("ELCA")) .collect(Collectors.toList()); imcomes2.forEach(i -> System.out.println(i.toString())); } }
Output:
Income{sender=’ELCA’, receiver=’HGA’, money=2.0E7, date=2019-01-01}
Income{sender=’ELCA’, receiver=’AKG’, money=2.0E8, date=2019-05-01}
———————————————–
Income{sender=’ELCA’, receiver=’HGA’, money=2.0E7, date=2019-01-01}
Income{sender=’ELCA’, receiver=’AKG’, money=2.0E8, date=2019-05-01}