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()เพื่อสร้างผลข้างเคียง และเชื่อมต่อด้วยandThenBiConsumer<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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Function และ BiFunction
- Supplier และ Consumer
- Predicate และการประกอบ
- อินเทอร์เฟซเชิงฟังก์ชันแบบกำหนดเอง