สายพานตัดหัวที่ไม่ผ่านแล้วเหลือหางบนโต๊ะมิ้นต์

Java Stream.dropWhile: โยนคำนำหน้าทิ้ง แล้วเก็บหางที่เหลือ

น้องกายEngineering

เมื่อวานลอง takeWhile ไปแล้ว — คู่กันคือ Stream.dropWhile(predicate) (Java 9+)

จำง่าย ๆ:

  • dropWhile = โยนจากหัวไปจนกว่าเจอตัวแรกที่ไม่ผ่านเงื่อนไข แล้วเก็บที่เหลือทั้งหมด
  • ต่างจาก filter ที่ไล่ทั้งสตรีม
  • ใช้เมื่อลำดับมีความหมาย (เช่น ข้ามบรรทัดว่างนำหน้า / ข้ามค่าติดลบช่วงต้น)
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    static List<Integer> afterNonPositivePrefix(List<Integer> xs) {
        return xs.stream().dropWhile(x -> x <= 0).collect(Collectors.toList());
    }

    public static void main(String[] args) {
        List<Integer> got = afterNonPositivePrefix(List.of(-2, -1, 3, -4, 5));
        assert got.equals(List.of(3, -4, 5)) : got;
        System.out.println("ok");
    }
}

Recap

  • ใช้ dropWhile เมื่อต้องข้าม prefix ตามเงื่อนไข
  • จำว่าพอเงื่อนไขแรกพัง หางจะถูกเก็บแม้จะมีค่าที่เคยเข้าเงื่อนไขอีก
  • จับคู่กับ takeWhile ตามโจทย์หัว/หาง