0Pricing
Java Academy · บทเรียน

Supplier และ Consumer

สร้างและรับค่ามาใช้

Supplier และ Consumer เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

หน้าที่ของตัวจัดหา

Supplier<T> ไม่รับอาร์กิวเมนต์ใดเลย และสร้างค่าชนิด T

  • เมธอดของมันคือ T get()
  • เหมาะอย่างยิ่งสำหรับการสร้างค่าแบบชะลอหรือเลื่อนเวลาออกไป
import java.util.function.Supplier;

public class Main {
    public static void main(String[] args) {
        Supplier<String> greeting = () -> "Hello!";
        System.out.println(greeting.get());
    }
}

ตัวจัดหาทำงานแบบชะลอ

โค้ดภายใน Supplier จะทำงานเมื่อเรียก get เท่านั้น ทำให้ตัวจัดหาเหมาะสำหรับค่าเริ่มต้นที่ใช้ทรัพยากรมากและคุณอาจไม่จำเป็นต้องใช้

import java.util.function.Supplier;

public class Main {
    public static void main(String[] args) {
        Supplier<Integer> expensive = () -> {
            System.out.println("computing...");
            return 42;
        };
        System.out.println("before get");
        System.out.println(expensive.get());
    }
}

ตัวจัดหาสำหรับค่าเริ่มต้น

ส่วนติดต่อโปรแกรมประยุกต์จำนวนมากรับ Supplier เพื่อคำนวณค่าเมื่อจำเป็นเท่านั้น เช่น Optional.orElseGet

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Optional<String> name = Optional.empty();
        System.out.println(name.orElseGet(() -> "default"));
    }
}

หน้าที่ของตัวรับ

Consumer<T> รับค่าและไม่คืนสิ่งใดกลับมา (void)

  • เมธอดของมันคือ void accept(T t)
  • ใช้สำหรับผลข้างเคียง เช่น การพิมพ์หรือการบันทึกเหตุการณ์
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Consumer<String> printer = s -> System.out.println("Got: " + s);
        printer.accept("data");
    }
}

ตัวรับกับ forEach

จุดที่คุณมักพบ Consumer มากที่สุดคือ Iterable.forEach และ Stream.forEach

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> items = List.of("a", "b", "c");
        items.forEach(item -> System.out.println(item));
    }
}

การเชื่อมตัวรับด้วย andThen

Consumer รองรับ andThen ซึ่งเรียกใช้ตัวรับสองรายการตามลำดับกับข้อมูลนำเข้าเดียวกัน

import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Consumer<String> first = s -> System.out.println("upper: " + s.toUpperCase());
        Consumer<String> second = s -> System.out.println("len: " + s.length());
        first.andThen(second).accept("hello");
    }
}

BiConsumer สำหรับข้อมูลเข้าสองรายการ

BiConsumer<T, U> รับอาร์กิวเมนต์สองรายการและไม่คืนค่า Map.forEach ใช้สิ่งนี้เพื่อวนซ้ำคู่คีย์และค่า

import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> ages = Map.of("Ann", 30, "Bob", 25);
        ages.forEach((name, age) -> System.out.println(name + "=" + age));
    }
}

การอ้างอิงเมธอดในฐานะตัวรับ

การอ้างอิงเมธอดอย่าง System.out::println เป็น Consumer ที่กระชับและสะอาด

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> nums = List.of(1, 2, 3);
        nums.forEach(System.out::println);
    }
}

การรวมตัวจัดหาและตัวรับ

Supplier สามารถส่งค่าที่สร้างขึ้นไปยัง Consumer ได้โดยตรง เกิดเป็นลำดับการผลิตแล้วรับที่เรียบง่าย

import java.util.function.Supplier;
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Supplier<String> source = () -> "payload";
        Consumer<String> sink = s -> System.out.println("received " + s);
        sink.accept(source.get());
    }
}

ซัพพลายเออร์ที่ส่งคืนออบเจ็กต์

คอนสตรักเตอร์สามารถสร้างซัพพลายเออร์ได้โดยธรรมชาติด้วย ClassName::new เมื่อไม่จำเป็นต้องใช้อาร์กิวเมนต์

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

public class Main {
    public static void main(String[] args) {
        Supplier<List<String>> factory = ArrayList::new;
        List<String> list = factory.get();
        list.add("x");
        System.out.println(list);
    }
}

ผลข้างเคียงเทียบกับฟังก์ชันบริสุทธิ์

โปรดจำความแตกต่างนี้ไว้:

  • Supplier: ไม่มีข้อมูลเข้า และสร้างข้อมูลออก
  • Consumer: รับข้อมูลเข้า แต่ไม่สร้างข้อมูลออก (มีผลข้างเคียง)
  • Function: รับข้อมูลเข้าและคืนข้อมูลออก
import java.util.function.Supplier;
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        Supplier<Integer> dice = () -> 4;
        Consumer<Integer> show = n -> System.out.println("rolled " + n);
        show.accept(dice.get());
    }
}

ตรวจสอบอย่างรวดเร็ว

อินเทอร์เฟซเชิงฟังก์ชันใดไม่รับอาร์กิวเมนต์และคืนค่า

สรุปทบทวน

คุณได้สร้างและใช้ค่าด้วยแนวทางเชิงฟังก์ชัน:

  • Supplier<T> ใช้ get() เพื่อสร้างค่าแบบประเมินเมื่อจำเป็น
  • Consumer<T> ใช้ accept() เพื่อสร้างผลข้างเคียง และเชื่อมต่อด้วย andThen
  • BiConsumer<T,U> จัดการข้อมูลเข้าสองรายการ เช่นเดียวกับ Map.forEach
  • การอ้างอิงเมธอดและการอ้างอิงคอนสตรักเตอร์ช่วยให้ทั้งสองแบบกระชับ

คำถามที่พบบ่อย

บทเรียน “Supplier และ Consumer” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Supplier และ Consumer” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Supplier และ Consumer”

สร้างและรับค่ามาใช้ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “Supplier และ Consumer” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Function และ BiFunction
  2. Supplier และ Consumer
  3. Predicate และการประกอบ
  4. อินเทอร์เฟซเชิงฟังก์ชันแบบกำหนดเอง
← กลับไปที่ Java Academy