Java Stream.takeWhile: ตัดคำนำหน้าตามเงื่อนไข แล้วหยุดทันที
น้องกายEngineering
อยากตัดสตรีมเมื่อเงื่อนไขแรกไม่ผ่านโดยไม่กรองทั้งก้อนใช่ไหมครับ — ใช้ Stream.takeWhile(predicate) (Java 9+)
เทียบสั้น ๆ:
filter= ดูทุกตัว เก็บที่ผ่านtakeWhile= เก็บจากหัวไปจนกว่าเจอตัวแรกที่ไม่ผ่าน แล้วหยุด- คู่กันคือ
dropWhile= โยนหัวที่ไม่ผ่าน ทิ้งไว้ส่วนท้าย
import java.util.List;
import java.util.stream.Collectors;
public class Main {
static List<Integer> headPositive(List<Integer> xs) {
return xs.stream().takeWhile(x -> x > 0).collect(Collectors.toList());
}
public static void main(String[] args) {
List<Integer> got = headPositive(List.of(3, 1, -2, 5));
assert got.equals(List.of(3, 1)) : got;
System.out.println("ok");
}
}
Recap
- ใช้ takeWhile เมื่อลำดับมีความหมายจากหัว (sorted / prefix)
- อย่าสับสนกับ filter — takeWhile หยุดเร็วและทิ้งหางแม้หางจะผ่านเงื่อนไข
- อ่านJava SE Stream.takeWhile