[Java] Java 8 ทำความเข้าใจให้มากขึ้นกับ Lambda Expression
เรื่องของ lambda คงต้องขยายความกันหน่อย หลังจากเกริ่นนำไปในโพส Java 8 มาเขียน lambda กันเถอะ ก็ทำให้ได้เห็น syntax กันไปบ้างแล้ว ครั้งนี้เราจะเพิ่มความรู้ว่า เขียนโปรแกรมยังไงให้ใช้ Lambda Expression ได้
แบบย่อ
filter : เป็นการ loop เพื่อดึง element ตามเงื่อนไข (return boolean)
OnClickListener บน Android ก็เรียกด้วย Lambda ได้นะ (แต่ต้องทำให้รองรับ Java 8 ซะก่อน)
สรุปแล้ว Lambda และ Stream อาจจะไม่ได้มาแทนอะไรเลย เพียงแต่มาช่วยให้ code สั้นขึ้น และปรับตามหลาย ๆ ภาษาที่มี code ลักษณะนี้ให้เห็น ถ้าสามารถใช้ Java 8 ได้เลยก็แนะนำครับเพราะเค้า big change จริง ๆ
Syntax ของ Lambda
- Parameter คล้ายกับการเขียน method บางครั้งอาจมีวงเล็บ
- Optional Parameter Type ปกติมักจะไม่ใส่กัน
- Parameter Name สามารถตั้งอะไรก็ได้ ไม่จำเป็นต้องเหมือนกับ method
- Arrow ( -> )
- Body เหมือนกับ statement ทั่วไป คือถ้ามีคำสั่งเดียวก็ไม่จำเป็นต้องใส่ block
แบบย่อ
message -> System.out.prinln(message);แบบเต็ม
(String message) -> { System.out.prinln(message); };แบบนิยม
(message) -> { System.out.prinln(message); };
รูปแบบการเขียนตามจำนวน parameter
0 parameter() -> /* single statement */; () -> { /* statements block */ };1 parameter
p -> /* single statement */; p -> {/* statements block */}; (p) -> /* single statement */; (p) -> {/* statements block */}; (T p) -> {/* statements block */}; (T p) -> {/* statements block */};2+ parameters
(p1,p2) -> /* single statement */; (p1, p2) -> {/* statements block */}; (T p1, T p2) -> /* single statement */; (T p1, T p2) -> {/* statements block */};
Stream
คือ Class ที่เพิ่มมาใน Java 8 เพื่อช่วยให้ใช้งาน Java Collections เช่น List, Set เป็นต้น ที่สำคัญมันทำให้ Lambda Expression มีบทบาทมากยิ่งขึ้น และผสมผสานกันอย่างลงตัวint[] ints = new int[]{1,2,73,25,0}; Arrays.stream(i).sorted().toArray(); //0, 1, 2, 25, 73
List animals = new ArrayList(); animals.add("Cat"); animals.add("Dog"); animals.add("Ant"); animals.add("Cat");
animals.stream().distinct().sorted().collect(Collectors.toList()); //[Ant, Cat, Dog]
Mapcounted = (Map)animals.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); //{Ant=1, Cat=2, Dog=1}
การใช้ Stream ร่วมกับ Lambda
forEach : เป็นการ loop เพื่อดึง element ขึ้นมาanimals.forEach((elm) -> { System.out.println(elm); });
filter : เป็นการ loop เพื่อดึง element ตามเงื่อนไข (return boolean)
animals.stream().filter((p) -> { return p.equals("Cat"); });
ใช้ Lambda กับ class ของเราเอง
ไม่เพียงแต่ใช้เป็น parameter ให้กับ Stream เท่านั้น เรายังสามารถเขียนเองใช้เองได้ด้วย ซึ่งการเขียน lambda นั้นมีข้อพึงระวังก็คือ interface ที่จะใช้งานต้องมีเพียง method เพียงตัวเดียวเท่านั้น มิฉะนั้นจะต้องเรียกใช้แบบ Anonymous Class//declare interface interface HelloLambda { public void sayHi(); }
//using lambda HelloLambda greeting = () -> System.out.println("Hello"); greeting.sayHi(); // "Hello"
OnClickListener บน Android ก็เรียกด้วย Lambda ได้นะ (แต่ต้องทำให้รองรับ Java 8 ซะก่อน)
public interface OnClickListener { void onClick(View v); }
button.setOnClickListener((v) -> { });
สรุปแล้ว Lambda และ Stream อาจจะไม่ได้มาแทนอะไรเลย เพียงแต่มาช่วยให้ code สั้นขึ้น และปรับตามหลาย ๆ ภาษาที่มี code ลักษณะนี้ให้เห็น ถ้าสามารถใช้ Java 8 ได้เลยก็แนะนำครับเพราะเค้า big change จริง ๆ