forEach ใน Java 8

ผมเชื่อว่าหลายคนเคยเขียน loop เพื่อดึงค่าข้อมูลใน List มาใช้งานโดยใช้คำสั่ง for หน้าตาประมาณนี้

for (Integer value : values) {
	System.out.println(value);
}

เราเรียก loop ที่ได้ค่ามาโดยที่เราไม่ต้องระบุ index แบบนี้ว่า for-each ใน Java 8 ได้มีการเตรียมการ for-each ให้แล้ว เพียงแค่เรียกเมธอดเดียวก็สามารถใช้งานได้เลย ข้อแม้คือคลาสนั้นต้องมีการ implements Iterable ถึงจะใช้ได้

for-each แบบปกติ

ผมสร้างตัวแปร ArrayList ตัวหนึ่งขึ้นมาแล้วทำการ for-each แบบปกติจะได้หน้าตาดังนี้

List<Integer> values = Arrays.asList(1, 2, 3, 4, 5);

for (Integer value : values) {
	System.out.println(value);
}

ด้วยความชินตาเราคงไม่รู้สึกอะไร ถ้ามองอีกมุมหนึ่งคือเราเขียนโค้ดหลายบรรทัดตั้งแต่คำสั่ง for รวมถึงปีกกาเปิดปิดด้วย

forEach ใน Java 8

เนื่องจาก List สืบทอด Iterable ทำให้มีเมธอด forEach ให้ใช้งาน ซึ่งหน้าตาที่ได้ก็จะเป็นประมาณนี้

List<Integer> values = Arrays.asList(1, 2, 3, 4, 5);
values.forEach(new Consumer<Integer>(){

	@Override
	public void accept(Integer t) {
		System.out.println(t);
	}
			
});

อ้าววว เขียนเยอะกว่าเดิมอีก มีการสร้าง object ด้วย แล้วมันดีกว่าของเดิมยังไง?

Lambda Expression

ด้วยความสามารถของ Lambda ทำให้เราสามารถยุบโค้ดลงโดยไม่ต้องเขียนคำสั่ง new object ของ Consumer ได้ดังนี้

List<Integer> values = Arrays.asList(1, 2, 3, 4, 5);
values.forEach(value -> System.out.println(value));

เงื่อนไขการทำ Labmda นั้น ปลายทางต้องเป็น functional interface คือมี abstract method เพียงหนึ่งตัวเท่านั้นจึงจะทำแบบนี้ได้ ซึ่ง interface Consumer เข้ามาตอบโจทย์ตรงนี้พอดี ทำให้เราสามารถเขียน Lambda Expression ได้นั่นเอง

Lambda Expression + Method Reference

ขั้นสุดของการ println ที่สั้นที่สุด เราสามารถใช้ method reference คู่กันได้ดังนี้

List<Integer> values = Arrays.asList(1, 2, 3, 4, 5);
values.forEach(System.out::println);

Map

อีกตัวอย่างหนึ่งที่ forEach มีประโยชน์ นั่นคือการวนลูปใน Map ดังนี้

//init data
Map<Integer, String> map = new HashMap<>();
for(int i = 0; i< 10; i++){
	map.put(i, "value " + i);
}

// loop foreach
map.forEach((key, value) -> System.out.println("Key: " + key + "\t" + value));
Advertisements

One thought on “forEach ใน Java 8

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

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