Java Lambda Expressions
Java Lambda Expressions
เพิ่ม Lambda Expressions ใน Java 8
นิพจน์แลมบ์ดาคือโค้ดสั้นๆ ที่รับพารามิเตอร์และส่งกลับค่า นิพจน์แลมบ์ดามีความคล้ายคลึงกับเมธอด แต่ไม่ต้องการชื่อ และสามารถนำไปใช้ในเนื้อหาของเมธอดได้
ไวยากรณ์
นิพจน์แลมบ์ดาที่ง่ายที่สุดมีพารามิเตอร์เดียวและนิพจน์:
parameter -> expression
หากต้องการใช้มากกว่าหนึ่งพารามิเตอร์ ให้ใส่วงเล็บ:
(parameter1, parameter2) -> expression
นิพจน์มีจำกัด พวกเขาต้องคืนค่าทันที และ ต้องไม่มีตัวแปร การมอบหมาย หรือคำสั่ง เช่นif
หรือ for
เพื่อดำเนินการที่ซับซ้อนมากขึ้น สามารถใช้บล็อกโค้ดกับวงเล็บปีกกาได้ หากนิพจน์แลมบ์ดาจำเป็นต้องคืนค่า บล็อกโค้ดควรมีreturn
คำสั่ง
(parameter1, parameter2) -> { code block }
การใช้นิพจน์แลมบ์ดา
นิพจน์แลมบ์ดามักจะส่งผ่านเป็นพารามิเตอร์ไปยังฟังก์ชัน:
ตัวอย่าง
ใช้นิพจน์ lamba ในวิธีArrayList
's forEach()
เพื่อพิมพ์ทุกรายการในรายการ:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(5);
numbers.add(9);
numbers.add(8);
numbers.add(1);
numbers.forEach( (n) -> { System.out.println(n); } );
}
}
นิพจน์แลมบ์ดาสามารถเก็บไว้ในตัวแปรได้หากชนิดของตัวแปรเป็นอินเทอร์เฟซที่มีวิธีเดียวเท่านั้น นิพจน์แลมบ์ดาควรมีจำนวนพารามิเตอร์เท่ากันและมีประเภทส่งคืนเหมือนกับเมธอดนั้น Java มีอินเทอร์เฟซหลายประเภทในตัว เช่นConsumer
อินเทอร์เฟซ (พบในjava.util
แพ็คเกจ) ที่ใช้โดยรายการ
ตัวอย่าง
ใช้อินเทอร์เฟซของ Java Consumer
เพื่อเก็บนิพจน์แลมบ์ดาในตัวแปร:
import java.util.ArrayList;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(5);
numbers.add(9);
numbers.add(8);
numbers.add(1);
Consumer<Integer> method = (n) -> { System.out.println(n); };
numbers.forEach( method );
}
}
ในการใช้นิพจน์แลมบ์ดาในเมธอด เมธอดควรมีพารามิเตอร์ที่มีอินเตอร์เฟสเมธอดเดียวเป็นประเภท การเรียกใช้เมธอดของอินเทอร์เฟซจะเรียกใช้นิพจน์แลมบ์ดา:
ตัวอย่าง
สร้างวิธีการที่ใช้นิพจน์แลมบ์ดาเป็นพารามิเตอร์:
interface StringFunction { String run(String str);
}public class Main { public static void main(String[] args) { StringFunction exclaim = (s) -> s + "!"; StringFunction ask = (s) -> s + "?"; printFormatted("Hello", exclaim); printFormatted("Hello", ask);
}public static void printFormatted(String str, StringFunction format) { String result = format.run(str); System.out.println(result);
}}