Stream API: takeWhile vs dropWhile
Java 9 เพิ่ม takeWhile() และ dropWhile() ให้ Stream interface ทำงานกับ Predicate
takeWhile()
พฤติกรรม: รับ elements ตั้งแต่ต้นจนกว่า predicate จะเป็น false
Syntax
default Stream<T> takeWhile(Predicate<? super T> predicate)
ตัวอย่าง
Stream.of("India", "Australia", "Newzealand", "", "South Africa", "England")
.takeWhile(o -> !o.isEmpty())
.forEach(System.out::print);
// Output: IndiaAustraliaNewzealand
dropWhile()
พฤติกรรม: ข้าม elements ตั้งแต่ต้นจนกว่า predicate จะเป็น false แล้วคืนส่วนที่เหลือ
Syntax
default Stream<T> dropWhile(Predicate<? super T> predicate)
ตัวอย่าง
Stream.of("India", "Australia", "Newzealand", "", "England", "Srilanka")
.dropWhile(o -> !o.isEmpty())
.forEach(System.out::print);
// Output: EnglandSrilanka
Stream.of("India", "", "Australia", "", "England", "Srilanka")
.dropWhile(o -> !o.isEmpty())
.forEach(System.out::print);
// Output: AustraliaEnglandSrilanka
ตารางเปรียบเทียบ
| คุณสมบัติ | takeWhile() | dropWhile() |
|---|---|---|
| Stream ที่มีลำดับ (ordered) | Longest prefix matching predicate | Remaining after prefix |
| Stream ไม่มีลำดับ (unordered) | Subset matching predicate | Remaining after dropping subset |
| ใช้เมื่อ | ต้องการ prefix ที่ตรงเงื่อนไข | ต้องการข้อมูลหลังจากเงื่อนไขหยุด |
สรุป
takeWhile= "เอาไปจนกว่า..." (prefix)dropWhile= "ทิ้งไปจนกว่า... แล้วเอาต่อ" (suffix after condition fails)