Interface java.util.function.UnaryOperator<T> (extends Function<T,T>) ใช้สำหรับ operation บน operand เดียว ที่คืนค่า type เดียวกัน สามารถ implement เองได้
เมธอด List.replaceAll(UnaryOperator<E>) นำ operator ไปใช้กับทุก element แล้วแทนที่ใน list
ตัวอย่าง: Custom UnaryOperator แปลง Uppercase
import java.util.ArrayList;
import java.util.function.UnaryOperator;
class Op implements UnaryOperator<String> {
@Override
public String apply(String str) {
return str.toUpperCase();
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("JavaScript");
list.add("CoffeeScript");
list.add("HBase");
list.add("OpenNLP");
System.out.println("Contents of the list: " + list);
list.replaceAll(new Op());
System.out.println("Contents of the list after replace operation:\n" + list);
}
}
ผลลัพธ์
Contents of the list: [Java, JavaScript, CoffeeScript, HBase, OpenNLP]
Contents of the list after replace operation: [JAVA, JAVASCRIPT, COFFEESCRIPT, HBASE, OPENNLP]
เปรียบเทียบ: Class vs Lambda
| รูปแบบ | Code | เหมาะสำหรับ |
|---|---|---|
| Implement class | class Op implements UnaryOperator<String> { apply() } | Logic ซับซ้อน, ใช้ซ้ำหลายที่, ต้องการ state |
| Lambda | s -> s.toUpperCase() | Logic เรียบง่าย, ใช้ครั้งเดียว, inline |
| Method reference | String::toUpperCase | เรียก method โดยตรง |
ตัวอย่าง Lambda
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("JavaScript");
list.add("CoffeeScript");
list.add("HBase");
list.add("OpenNLP");
System.out.println("Before: " + list);
list.replaceAll(s -> s.toUpperCase());
System.out.println("After: " + list);
}
}
UnaryOperator อื่นๆ ใน JDK
Function.identity()- คืนค่า input เดิม (t -> t)UnaryOperator.identity()- เหมือนกัน แต่ type-safe
ข้อควรระวัง
replaceAllแก้ไข list ตรงที่ (mutates) - ไม่สร้าง list ใหม่- Operator ต้องคืนค่า type เดียวกับ input (
T -> T) - Null safety: operator หรือ element เป็น null → NPE
- Thread-safety: ArrayList ไม่ thread-safe
เมื่อไหร่ควรสร้าง Custom Class?
- Logic ซับซ้อน หลายบรรทัด
- ต้องการ state (fields) ใน operator
- ใช้ซ้ำในหลายที่ (reusability)
- ต้องการ unit test แยกต่างหาก
- Implement interface อื่นด้วย (เช่น Serializable)