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 ตามโจทย์หัว/หาง