Java Matcher.results: เก็บทุกแมตช์เป็น Stream โดยไม่วน find เอง
น้องกายEngineering
การวน while (matcher.find()) ใช้ได้ แต่พอกอง logic ในลูปจะอ่านยากครับ จาก Java 9 Matcher.results() คืน Stream<MatchResult> ให้ map/filter แบบ pipeline
WHY: แยกการหา กับ การแปลง
เหมือนสายพานคัดแสตมป์: เครื่องหาดวงที่ตรงแบบ แล้วคนแปะป้ายหมวด แยกขั้นแล้วเทสทีละชั้นได้
HOW: สกัดรหัสคำสั่งจากข้อความ
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("ORD-\\d{4}");
Matcher matcher = pattern.matcher("order ORD-1001 and ORD-2099 ready");
List<String> codes = matcher.results().map(m -> m.group()).toList();
assert codes.equals(List.of("ORD-1001", "ORD-2099")) : codes;
assert codes.size() == 2;
}
}
results() เริ่มจากตำแหน่งปัจจุบันของ matcher ถ้าเคย find ไปแล้ว สตรีมจะต่อจากจุดนั้น — สร้าง matcher ใหม่เมื่อต้องการสแกนทั้งข้อความ
Recap
- ใช้
results()เมื่อต้องการ pipeline ของแมตช์ - สร้าง matcher ใหม่ถ้าต้องการสแกนทั้งอินพุต
- map เป็นชนิดธุรกิจทันที อย่าเก็บ MatchResult ค้างนาน
- เขียน assert จำนวนและค่าที่คาดหวัง