นากกายกำลังเก็บแสตมป์ที่ตรงรูปแบบจากสายพานลงถาดผลลัพธ์โดยไม่เดินวนซ้ำด้วยมือ

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 จำนวนและค่าที่คาดหวัง