Java String.transform: ตั้งชื่อ pipeline แปลงข้อความแทนการซ้อนเมธอด
การซ้อนเมธอดแปลงข้อความหลายชั้นทำให้เราอ่านจากวงเล็บในสุดออกมาข้างนอกครับ String.transform กลับทิศให้เริ่มจากข้อความ แล้วส่งเข้า Function ที่ตั้งชื่อและทดสอบแยกได้
WHY: pipeline อ่านตามลำดับงาน
เหมือนสายพานที่ของไหลจากซ้ายไปขวา เราเห็นขั้น trim แล้ว normalize แล้ว validate แทนการหาว่าวงเล็บไหนทำก่อน transform ไม่ได้ทำให้ string mutable; มันเพียงเรียก function ด้วย string ปัจจุบันและคืนชนิดผลลัพธ์ของ function
import java.util.Locale;
import java.util.function.Function;
public class Main {
static final Function<String, String> NORMALIZE = value ->
value.strip().toLowerCase(Locale.ROOT).replace(' ', '-');
static String slug(String input) {
return input.transform(NORMALIZE);
}
public static void main(String[] args) {
assert slug(" Showkhun Blog ").equals("showkhun-blog");
assert "abc".transform(String::length) == 3;
System.out.println("String.transform checks passed");
}
}
ข้อดีชัดเมื่อ function เป็น domain operation ที่มีชื่อ เช่น normalizeUserId หรือ redactSecret ถ้าเป็นการเรียกสั้น ๆ ครั้งเดียวอย่าง value.strip() การใช้เมธอดตรงอ่านง่ายกว่า อย่าเพิ่ม abstraction เพียงเพื่อให้ทุกบรรทัดดูเป็น functional style
Recap
-
transformส่ง string เข้าFunction - ผลลัพธ์ไม่จำเป็นต้องเป็น String
- ตั้งชื่อ function เมื่อเป็นกฎ domain ที่ใช้ซ้ำ
- ใช้เมธอดตรงเมื่อ pipeline สั้นและชัดอยู่แล้ว