Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Custom UnaryOperator Implementation ใน Java

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 classclass Op implements UnaryOperator<String> { apply() }Logic ซับซ้อน, ใช้ซ้ำหลายที่, ต้องการ state
Lambdas -> s.toUpperCase()Logic เรียบง่าย, ใช้ครั้งเดียว, inline
Method referenceString::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)