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

List.replaceAll(UnaryOperator) Method ใน Java

เมธอด replaceAll() ของ interface List รับ object ของ UnaryOperator<E> แสดงถึง operation บน element เดียว นำไปใช้กับทุก element ใน list แล้วแทนที่ค่าเดิมด้วยผลลัพธ์

UnaryOperator<T> เป็น functional interface (extends Function<T,T>) ใช้สำหรับ lambda expressions ที่รับ input และคืนค่า type เดียวกัน

ตัวอย่าง: แปลงเป็นตัวพิมพ์ใหญ่ทั้งหมด

import java.util.ArrayList;
import java.util.function.UnaryOperator;

class Op implements UnaryOperator<String> {
    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]

ใช้ Lambda Expression (Java 8+)


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);
        
        // Lambda expression แทน class Op
        list.replaceAll(s -> s.toUpperCase());
        
        System.out.println("After: " + list);
    }
}

ผลลัพธ์

Before: [Java, JavaScript, CoffeeScript, HBase, OpenNLP]
After: [JAVA, JAVASCRIPT, COFFEESCRIPT, HBASE, OPENNLP]

ตัวอย่างเพิ่มเติม

ข้อควรระวัง

  • replaceAll แก้ไข list ตรงที่ (in-place) ไม่คืน list ใหม่
  • Type ของ element ต้องเหมือนเดิม (UnaryOperator<T>: T → T)
  • ถ้าต้องการเปลี่ยน type ให้ใช้ stream().map(...).collect() แทน
  • Throws NullPointerException ถ้า operator หรือ element เป็น null

ความแตกต่างกับ Collections.replaceAll()

  • List.replaceAll(UnaryOperator) - transform ทุก element ด้วย function
  • Collections.replaceAll(List, oldVal, newVal) - แทนที่ค่าเก่าด้วยค่าใหม่ (equals comparison)
OperationLambdaInput → Output
เพิ่ม prefixs -> "ITEM_" + s"apple" → "ITEM_apple"
ตัด whitespaceString::trim" hello " → "hello"
แทนที่ substrings -> s.replace("Java", "Kotlin")"Java 8" → "Kotlin 8"
คำนวณความยาวString::length"hello" → 5 (type เปลี่ยนเป็น Integer!)