[Java] Java 8 ทำความเข้าใจให้มากขึ้นกับ Lambda Expression

          เรื่องของ lambda คงต้องขยายความกันหน่อย หลังจากเกริ่นนำไปในโพส Java 8 มาเขียน lambda กันเถอะ ก็ทำให้ได้เห็น syntax กันไปบ้างแล้ว ครั้งนี้เราจะเพิ่มความรู้ว่า เขียนโปรแกรมยังไงให้ใช้ Lambda Expression ได้

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]
Map counted = (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");
});

          ไม่เพียงแต่ใช้เป็น 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 จริง ๆ


Facebook Comment

Popular post of 7 days

[Android] เปิดเครื่องไม่ได้ โลโก้ค้าง (Boot Loop)

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

ลืมรหัสปลดล็อค Android เข้าเครื่องไม่ได้ มีทางออกครับ