Java 8 – Lambda Expression

Lambda Expression คือการสร้าง Anonymous Object ด้วย syntax ที่สั้นลง (anonymous object คือการ new interface แล้ว implement โค้ดกันสดๆ ตอนนั้นเลย) เช่นในตอนที่แล้วผมทำการลูป forEach แล้วลดรูปลง

สำหรับคนที่ต้องการใช้งาน lambda expression ไม่ใช่ว่าอยู่ๆ ก็จะสามารถใช้ได้เลยนะครับ โดยเขายึดหลักอยู่สามข้อดังนี้

  1. Logic ต้องง่าย หากมีความซับซ้อนก็ให้ไป new Class แล้วทำการ implement ตามปกติ
  2. Interface นั้นจะต้องอยู่ในรูปแบบที่เรียกว่า functional interface
  3. method นั้นจะต้องไม่มี side effect (pure functional) คือไม่ควรมีการไปแก้ไขค่าตัวแปรที่อยู่ข้างนอก scope ของ method

Functional Interface

ไม่ใช่ทุก Interface จะสามารถสร้างด้วย Lambda Expression ได้ เงื่อนไขมีข้อเดียวคือ Interface นั้นต้องอยู่ในรูปแบบของ Functional Interface นั่นก็คือ

ข้างในต้องมี Abstract method เพียง method เดียวเท่านั้น (ไม่นับรวม default method)

หากเกินนี้จะทำเป็น Lambda expression ไม่ได้ หากเราสร้าง interface เอง ไม่ได้ใช้ของที่แถมมากับ jdk เราจะต้องใส่ @FunctionalInterface ตอนประกาศ interface ด้วย

หน้าตาเป็นประมาณนี้

  • มี abstract method อันเดียว
  • ใส่ @FunctionalInterface

ยกตัวอย่างเช่น forEach ที่ไปเรียก Consumer จากตอนที่แล้ว มีเมธอด 2 อันแต่อีกอันเป็น default method เราจึงไม่นับ

รูปแบบ

ตัวอย่างโค้ดการสร้าง Thread เพื่อแสดงข้อความ

Thread t = new Thread(new Runnable() {

	@Override
	public void run() {
		System.out.println("Hello");
	}
			
});

t.start();

เมื่อทำการลดรูปแล้วก็จะได้หน้าตาดังนี้

Thread t = new Thread(() -> System.out.println("Hello"));
t.start();

รูปแบบ Lambda Expression ประกอบด้วยสองคือ

  • ด้านซ้ายของลูกศรคือ parameter โดยปกติเราจะไม่ระบุ type คือประกาศแค่ชื่อแทนตัวแปรที่จะส่งเข้าไปใน method
  • ด้านขวาลูกศรคือ method body หาก method นั้นมีการ return ค่าเราจะไม่เขียน return คือพิมพ์โค้ดที่จะส่งค่าออกมาได้ทันที

ตัวอย่าง: การ sort string
จากเดิมที่ถ้าเราต้องการเรียง String ด้วย logic ของเราเอง เราจะต้องการทำสร้าง Comparator ขึ้นมาดังนี้

List<String> keywords = Arrays.asList("magickiat", "ched", "bom");
Collections.sort(keywords, new Comparator<String>() {

	@Override
	public int compare(String o1, String o2) {
		return o1.compareTo(o2);
	}
});
		
System.out.println(keywords);

เมื่อลดรูปแล้วก็จะได้ดังนี้

List<String> keywords = Arrays.asList("magickiat", "ched", "bom");
Collections.sort(keywords, (o1, o2) -> o1.compareTo(o2));
System.out.println(keywords);
  • Parameter: เมธอดใน compare(String o1, String o2) รับค่า parameter 2 ตัวเพื่อรับไป compare เราก็เขียนย่อเหลือเพียง (o1, o2)
  • Body: เมธอดใน compare ต้อง return ค่าเป็น int เพื่อเปรียบเทียบว่า 2 object นั้นมีค่าน้อยกว่า มากกว่า หรือเท่ากัน เราก็เขียนย่อเหลือเพียง o1.compareTo(o2)
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s