[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");
});


ใช้ 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 จริง ๆ


Facebook Comment

Recent Posts

Popular post of 7 days

Portal คืออะไรกันนะ???

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

Port Forwarding สำหรับคนใช้ AIS Fibre

Popular

Portal คืออะไรกันนะ???

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

มาตรฐานการตั้งชื่อตัวแปร (Naming Convention)

เรื่องของ ++i กับ i++

Port Forwarding สำหรับคนใช้ AIS Fibre

วิธีการสมัคร Apple Developer Program และ Enterprise Program ฉบับลงมือเอง

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

ทดสอบ Mobile App แบบ Automated ด้วย Appium ทำยังไงกันนะ

Deeplink, Universal Links คืออะไร ทำงานร่วมกับ Mobile App ได้ยังไง

Android Auto & Apple Carplay คืออะไร ใช้งานยังไง