นากกายเปิดวาล์วสตรีมบนโต๊ะมิ้นต์ ตัดลำดับเมื่อเจอชิ้นอำพัน

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