Stream api cung cấp cơ chế filter trên các collection giúp đơn giản hơn trong việc tìm kiếm và rút trích dữ liệu.
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 LinkedList với stream api filter
Ví dụ: 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.LinkedList; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { LinkedList<Income> linkedList = new LinkedList<>(); linkedList.add(new Income("ELCA", "HGA", 20000000, LocalDate.of(2019, 1, 1))); linkedList.add(new Income("KMS", "VVH", 100000000, LocalDate.of(2019, 1, 1))); linkedList.add(new Income("ELCA", "AKG", 200000000, LocalDate.of(2019, 5, 1))); linkedList.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 = linkedList.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 = linkedList.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.LinkedList; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { LinkedList<Income> linkedList = new LinkedList<>(); linkedList.add(new Income("ELCA", "HGA", 20000000, LocalDate.of(2019, 1, 1))); linkedList.add(new Income(null, "VVH", 100000000, LocalDate.of(2019, 1, 1))); linkedList.add(new Income("ELCA", "AKG", 200000000, LocalDate.of(2019, 5, 1))); linkedList.add(new Income("FPT", "FGH", 1000000, LocalDate.of(2019, 9, 1))); // Filter truoc cac gia tri null List<Income> imcomes1 = linkedList.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 = linkedList.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}