การอ้างอิงเมธอดแบบ Static
แทนที่ lambda ที่เรียกเมธอดแบบ static ด้วยการอ้างอิง ClassName::methodName
การอ้างอิงเมธอดแบบ Static เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
การอ้างอิงเมธอดคืออะไร
การอ้างอิงเมธอด คือแลมบ์ดาแบบย่อที่มอบหมายงานให้เมธอดที่มีอยู่แล้ว หากแลมบ์ดามีหน้าที่เพียงเรียกเมธอดเดียว การอ้างอิงเมธอดจะเขียนได้สะอาดและอ่านง่ายกว่า
import java.util.*;
import java.util.stream.*;
List<String> names = List.of("Alice", "Bob", "Carol");
// Lambda:
names.forEach(s -> System.out.println(s));
// Equivalent method reference:
names.forEach(System.out::println);ไวยากรณ์การอ้างอิงเมธอดสแตติก
การอ้างอิงเมธอดสแตติกมีรูปแบบ ClassName::staticMethodName และใช้ได้ทุกที่ที่อินเทอร์เฟซฟังก์ชันต้องการเมธอดที่มีลายเซ็นตรงกัน
import java.util.stream.*;
// Integer.parseInt(String) matches Function<String, Integer>
List<String> strs = List.of("1","2","3","4","5");
List<Integer> nums = strs.stream()
.map(Integer::parseInt) // replaces s -> Integer.parseInt(s)
.collect(Collectors.toList());
System.out.println(nums); // [1, 2, 3, 4, 5]Math.abs ในรูปแบบการอ้างอิงเมธอด
สามารถอ้างอิงเมธอดสแตติกจากคลาสอรรถประโยชน์ เช่น Math ได้โดยตรง:
import java.util.*;
import java.util.stream.*;
List<Integer> values = List.of(-3, 5, -1, 8, -4);
List<Integer> abs = values.stream()
.map(Math::abs) // replaces v -> Math.abs(v)
.collect(Collectors.toList());
System.out.println(abs); // [3, 5, 1, 8, 4]การอ้างอิงเมธอดสแตติกกับเพรดิเคต
เมธอดสแตติกที่คืนค่าบูลีนตรงตามเงื่อนไข สามารถใช้เป็น Predicate ได้:
import java.util.stream.*;
// String.isEmpty() is an instance method, but we can use a static helper
// Objects.isNull matches Predicate<Object>
List<String> mixed = Arrays.asList("hello", null, "world", null);
long nullCount = mixed.stream()
.filter(Objects::isNull)
.count();
System.out.println(nullCount); // 2
long nonNull = mixed.stream()
.filter(Objects::nonNull)
.count();
System.out.println(nonNull); // 2การอ้างอิง Comparator แบบสแตติก
สามารถอ้างอิงเมธอดสแตติกที่ตรงกับ Comparator ได้เช่นกัน:
import java.util.*;
import java.util.stream.*;
List<String> words = List.of("banana", "apple", "cherry");
// String.CASE_INSENSITIVE_ORDER is a Comparator
List<String> sorted = words.stream()
.sorted(String::compareToIgnoreCase)
.collect(Collectors.toList());
System.out.println(sorted); // [apple, banana, cherry]เมธอดตัวช่วยสแตติกแบบกำหนดเอง
กำหนดเมธอดอรรถประโยชน์สแตติกแล้วอ้างอิงโดยตรง:
class Validator {
static boolean isPositive(int n) { return n > 0; }
static String toLabel(int n) { return n > 0 ? "POS" : "NEG"; }
}
List<Integer> nums = List.of(-2, 3, -1, 5, 0);
List<Integer> positive = nums.stream()
.filter(Validator::isPositive)
.collect(Collectors.toList());
System.out.println(positive); // [3, 5]
List<String> labels = nums.stream()
.map(Validator::toLabel)
.collect(Collectors.toList());BiFunction กับเมธอดสแตติก
เมธอดสแตติกที่รับพารามิเตอร์สองตัวสามารถตรงกับ BiFunction<T,U,R> ได้:
import java.util.function.*;
// Math.max(int,int) → BiFunction... but needs IntBinaryOperator
java.util.function.IntBinaryOperator maxOp = Math::max;
System.out.println(maxOp.applyAsInt(7, 3)); // 7
// String.format as BiFunction? Only works if signature matches:
// Integer.sum(int,int) → IntBinaryOperator
java.util.function.IntBinaryOperator sum = Integer::sum;
System.out.println(sum.applyAsInt(10, 20)); // 30การจัดเรียงด้วย Comparator.comparing + การอ้างอิงสแตติก
ใช้ Comparator.comparing ร่วมกับการอ้างอิงเมธอดเพื่อจัดเรียงข้อมูลได้อย่างกระชับ:
record Person(String name, int age) {}
List<Person> people = List.of(
new Person("Charlie",30), new Person("Alice",25), new Person("Bob",35)
);
people.stream()
.sorted(Comparator.comparing(Person::name))
.forEach(p -> System.out.println(p.name()));
// Alice, Bob, Charlieควรใช้การอ้างอิงเมธอดสแตติกเมื่อใด
ใช้การอ้างอิงเมธอดสแตติกเมื่อ:
- เนื้อหาของแลมบ์ดาเป็นเพียงการเรียกเมธอดสแตติกหนึ่งครั้ง
- ไม่จำเป็นต้องแปลงอาร์กิวเมนต์
- ลายเซ็นของเมธอดตรงกับอินเทอร์เฟซฟังก์ชัน
หากต้องแปลงอาร์กิวเมนต์หรือเพิ่มตรรกะ ให้ใช้แลมบ์ดาต่อไป
เปรียบเทียบด้านความอ่านง่าย
เปรียบเทียบรูปแบบแลมบ์ดากับการอ้างอิงเมธอดแบบเคียงข้างกัน:
// Lambda style
Stream.of("1","2","3").map(s -> Integer.parseInt(s));
Stream.of(1,-2,3).filter(n -> n > 0);
Stream.of(-5,2,-1).map(n -> Math.abs(n));
// Method reference style
Stream.of("1","2","3").map(Integer::parseInt);
Stream.of(1,-2,3).filter(Validator::isPositive);
Stream.of(-5,2,-1).map(Math::abs);ข้อผิดพลาดที่พบบ่อย: ลายเซ็นไม่ถูกต้อง
การอ้างอิงเมธอดจะใช้ได้ก็ต่อเมื่อลายเซ็นตรงกับเมธอดนามธรรมของอินเทอร์เฟซฟังก์ชันทุกประการ หากชนิดหรือจำนวนอาร์กิวเมนต์ไม่ตรงกัน ให้ใช้แลมบ์ดาตัวห่อแทน
// Math.pow(double, double) needs two args — can't use as Function<Double, Double>
// This won't compile:
// Function<Double, Double> square = Math::pow; // ERROR
// Fix with lambda:
Function<Double, Double> square = n -> Math.pow(n, 2);
System.out.println(square.apply(5.0)); // 25.0ตรวจสอบความเข้าใจ
ข้อใดต่อไปนี้เป็นการอ้างอิงเมธอดสแตติกที่ถูกต้องและใช้เป็น Predicate<Object> ได้
สรุป: การอ้างอิงเมธอดสแตติก
ประเด็นสำคัญ:
- ไวยากรณ์: ClassName::staticMethodName
- ใช้แทนแลมบ์ดาที่มอบหมายงานให้เมธอดสแตติกเพียงเมธอดเดียว
- ลายเซ็นของเมธอดต้องตรงกับเมธอดนามธรรมของอินเทอร์เฟซฟังก์ชัน
- ใช้ได้กับเพรดิเคต, Function, ตัวรับค่า, Comparator และอื่น ๆ
- ใช้แลมบ์ดาเมื่อต้องแปลงอาร์กิวเมนต์หรือเพิ่มตรรกะ
คำถามที่พบบ่อย
บทเรียน “การอ้างอิงเมธอดแบบ Static” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การอ้างอิงเมธอดแบบ Static” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การอ้างอิงเมธอดแบบ Static”
แทนที่ lambda ที่เรียกเมธอดแบบ static ด้วยการอ้างอิง ClassName::methodName คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การอ้างอิงเมธอดแบบ Static” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การอ้างอิงเมธอดแบบ Static
- การอ้างอิงเมธอดอินสแตนซ์บนอินสแตนซ์เฉพาะ
- การอ้างอิงเมธอดของอินสแตนซ์ใดก็ได้
- การอ้างอิงตัวสร้าง