Lambda Expressions in Java 8
       By: Doron Goldgevicht




            March 2012
Lambda Expressions in a nutshell




All rights reserved @ Copyright AlphaCSP 2012
Lambda Syntax In Java 8*


                               *may change until Java 8 spec is finalized



All rights reserved @ Copyright AlphaCSP 2012
Lambda Syntax




                                                (int x, int y) -> x + y

                                            parameters              body




All rights reserved @ Copyright AlphaCSP 2012
Lambda Syntax



                                                () -> 42




                                 (String s) -> { System.out.println(s); }




All rights reserved @ Copyright AlphaCSP 2012
Functional interfaces
                                                  and lambda expressions




All rights reserved @ Copyright AlphaCSP 2012
Functional interfaces


             Java is “cheating” - No new structural function Type

             A Lambda expression implements a Functional interface

             Functional interface is any interface with just one method

             Functional interfaces already exist in Java. Examples:
             java.lang.Runnable
             java.util.Comparator
             java.io.FileFilter
             …
All rights reserved @ Copyright AlphaCSP 2012
Lambda VS anonymous inner class




All rights reserved @ Copyright AlphaCSP 2012
Lambda VS anonymous inner class

             Anonymous inner class:
              Comparator<Student> c = new Comparator<Student>(){
                 public int compare(Student s1, Student s2){
                   return s1.getScore().compareTo(s2.getScore())
                 }
              };


             Lambda expression:
              Comparator<Student> c = (s1, s2) -> s1.getScore().compareTo(s2.getScore());




            Less boilerplate!!!

            Lexical scoping

All rights reserved @ Copyright AlphaCSP 2012
Target typing
                                                with lambda expressions




All rights reserved @ Copyright AlphaCSP 2012
Target typing


      Target typing from surrounding context:

       Comparator<Student> c =




All rights reserved @ Copyright AlphaCSP 2012
Lambda In Action
                                                And a word about performance




All rights reserved @ Copyright AlphaCSP 2012
Lambda in action

      For loop
            int maxScore = 0;
            for (Student s : students) {
              if (s.getGradYear() == 2011) {
                 maxScore = Math.max(s.getScore(), maxScore);
              }
            }




             Describes what and how

             Inherently serial



All rights reserved @ Copyright AlphaCSP 2012
Lambda in action

      For loop
            int maxScore = 0;
            for (Student s : students) {
              if (s.getGradYear() == 2011) {
                 maxScore = Math.max(s.getScore(), maxScore);
              }
            }


       Lambda expressions
            int maxScore = students
                  .filter(s -> s.getGradYear() == 2011)
                  .map(s -> s.getScore())
                  .reduce(0, (int x, int y) -> x > y ? x : y);



All rights reserved @ Copyright AlphaCSP 2012
Lambda in action

      Lambda expressions
            int maxScore = students
                  .filter(s -> s.getGradYear() == 2011)
                  .map(s -> s.getScore())
                  .reduce(0, (int x, int y) -> x > y ? x : y);



             Describes what not how

             Allows parallelism
                                                                 Better performance!
             Allows lazy initialization



All rights reserved @ Copyright AlphaCSP 2012
Conclusion
                                                What is it good for?




All rights reserved @ Copyright AlphaCSP 2012
Conclusion – What is good for?


             Readability
             Less boilerplate (bye bye anon inner classes)
             Describe what not how
             Better code with better performance (with new JDK 8
             library support)
             Do try it at home! Even today!
             http://jdk8.java.net/lambda/



All rights reserved @ Copyright AlphaCSP 2012
Thank you


All rights reserved @ Copyright AlphaCSP 2012

Lambda expressions

  • 1.
    Lambda Expressions inJava 8 By: Doron Goldgevicht March 2012
  • 2.
    Lambda Expressions ina nutshell All rights reserved @ Copyright AlphaCSP 2012
  • 3.
    Lambda Syntax InJava 8* *may change until Java 8 spec is finalized All rights reserved @ Copyright AlphaCSP 2012
  • 4.
    Lambda Syntax (int x, int y) -> x + y parameters body All rights reserved @ Copyright AlphaCSP 2012
  • 5.
    Lambda Syntax () -> 42 (String s) -> { System.out.println(s); } All rights reserved @ Copyright AlphaCSP 2012
  • 6.
    Functional interfaces and lambda expressions All rights reserved @ Copyright AlphaCSP 2012
  • 7.
    Functional interfaces Java is “cheating” - No new structural function Type A Lambda expression implements a Functional interface Functional interface is any interface with just one method Functional interfaces already exist in Java. Examples: java.lang.Runnable java.util.Comparator java.io.FileFilter … All rights reserved @ Copyright AlphaCSP 2012
  • 8.
    Lambda VS anonymousinner class All rights reserved @ Copyright AlphaCSP 2012
  • 9.
    Lambda VS anonymousinner class Anonymous inner class: Comparator<Student> c = new Comparator<Student>(){ public int compare(Student s1, Student s2){ return s1.getScore().compareTo(s2.getScore()) } }; Lambda expression: Comparator<Student> c = (s1, s2) -> s1.getScore().compareTo(s2.getScore()); Less boilerplate!!! Lexical scoping All rights reserved @ Copyright AlphaCSP 2012
  • 10.
    Target typing with lambda expressions All rights reserved @ Copyright AlphaCSP 2012
  • 11.
    Target typing Target typing from surrounding context: Comparator<Student> c = All rights reserved @ Copyright AlphaCSP 2012
  • 12.
    Lambda In Action And a word about performance All rights reserved @ Copyright AlphaCSP 2012
  • 13.
    Lambda in action For loop int maxScore = 0; for (Student s : students) { if (s.getGradYear() == 2011) { maxScore = Math.max(s.getScore(), maxScore); } } Describes what and how Inherently serial All rights reserved @ Copyright AlphaCSP 2012
  • 14.
    Lambda in action For loop int maxScore = 0; for (Student s : students) { if (s.getGradYear() == 2011) { maxScore = Math.max(s.getScore(), maxScore); } } Lambda expressions int maxScore = students .filter(s -> s.getGradYear() == 2011) .map(s -> s.getScore()) .reduce(0, (int x, int y) -> x > y ? x : y); All rights reserved @ Copyright AlphaCSP 2012
  • 15.
    Lambda in action Lambda expressions int maxScore = students .filter(s -> s.getGradYear() == 2011) .map(s -> s.getScore()) .reduce(0, (int x, int y) -> x > y ? x : y); Describes what not how Allows parallelism Better performance! Allows lazy initialization All rights reserved @ Copyright AlphaCSP 2012
  • 16.
    Conclusion What is it good for? All rights reserved @ Copyright AlphaCSP 2012
  • 17.
    Conclusion – Whatis good for? Readability Less boilerplate (bye bye anon inner classes) Describe what not how Better code with better performance (with new JDK 8 library support) Do try it at home! Even today! http://jdk8.java.net/lambda/ All rights reserved @ Copyright AlphaCSP 2012
  • 18.
    Thank you All rightsreserved @ Copyright AlphaCSP 2012

Editor's Notes

  • #3 ביטוי למבדה זה פיצ&apos;ר חדש בשפה שייכנס בג&apos;אווה 8.מייודע מה זה ביטוי למבדה?מי יודע מה זהקלוז&apos;ור?בג&apos;אווה ביטויי למבדה הם גם קלוז&apos;ורים.לכןבאופן בלתי פורמלי ניתן להשתמש בשני המונחים כדי לדבר על אותו דבר.ביטוי למבדה זה בס&quot;הכ פונקציה אנונימית. פונקציה ללא שם שמוגדרת בתוך קונטקסט שמצפה לקבל פונקציה.בד&quot;כ נעביר ביטוי למבדה כפרמטר לפונקציה.למבדות (או קלוז&apos;ורים) הן אבן ייסוד בשפות פונקציונליות וקיימות זה מכבר גם בשפות מונחות עצמים כגון C#, objective C, Scala.כך שניתן לומר שעד היום ג&apos;אווה נשארה מאחור.עכשיו נראה איך כותבים ביטויי למבדה בג&apos;אווה 8...
  • #4 הערה לפני שמתחילים:הסינטקס של למבדה בג&apos;אווה 8 כפוף עדיין לשינויים מכיוון שה-Spec של ג&apos;אווה 8 עדיין לא סופי.
  • #5 ביטוי למבדה:פרמטרים (שני אינטים)חץ (goes to”&quot; או &quot;הולך ל&quot;)גוף שמחזיר ערך
  • #6 1. ביטוי שלאמקבל פרמטרים ומחזיר INTEGER.2. ביטוי שמקבל STRING, מדפיס אותו ולא מחזיר ערך. שימו לב ביטוי למבדה לא חייב להחזיר ערך.
  • #8 אז איך בעצם ביטוי למבדה יוצג בשפה, האם ג&apos;אווה 8 תציג טייפ חדש מסוג פונקציה?התשובה היא לא. המפתחים בחרו ללכת בדרך של להשתמש במה שכבר קיים – במקום להכניס טייפ חדש מסוג פונקציה לשפה,ביטוי למבדה יממש אינטרפייס – אינטרפייס פונקציונלי.כל אינטרפייס בעל מתודה אחת בלבד הוא אינטרפייס פונקציונלי. הקומפיילר יזהה אוטומטית כל אינטרפייס כזה.עבור כל אינטרפייס פונקציונלי נוכל לכתוב ביטויי למבדה כאינסטנסים שלו.אינטרפייסים פונקציונליים כבר קיימים בג&apos;אווה.Runnable – compareComparator – compareFileFilter - acceptהחל מג&apos;אווה 8 נוכל להשתמש בביטויי למבדה כדי ליצור אינסטנסים של האינטרפייסים האלו (במקום אנונימוסאינרקלאסס).
  • #10 כאן אנו רואים דוגמה לקומפרטור שמשווה בין סטודנטים לפי גובה הציונים שלהם.כך זה נראה כשמממשים את זה בעזרת אנונימוס אינר קלאסוכך זה נראה כשמממשים את זה עם ביטוי למבדה.פחות בוילרפלייט – נפטרים מכל הקוד המיתר שעוטף את המתודה באנונימוסאינר קלאסובלמבדה אנחנו מקבלים Lexical Scoping – שמות משתנים ומתודות מתפרשים כאילו היו בסביבה המיידיתמחוץ לביטוי הלמבדה.הנה 2 דוגמאות לבעיות עם אנונימוסאינר קלאס שנפתרות בעזרת Lexical Scopingניתן להשתמש ב-This מבלי לדאוג שנקבל אינסטנס לא ברור של אנונימוס-אינר-קלאס. במקום זאת נקבל אינסטנס של האובייקט בתוכו נמצא ביטוי הלמבדה.אם נקרא למשל ל-toString() יופעל ה-toString() של האובייקט בו נמצא ביטוי הלמבדה ולא toString() של שהאנונימוס-אינר-קלאסס ירש מהמחלקה Object.
  • #12 מעכשיו, בניגוד למה שהיה מקובל בג&apos;אווה עד היום – הקומפיילר מבין רמזיםהקומפיילר יכול להסיק שהטייפ של הפרמטרים בביטוי הלמבדה הזה הוא STUDNET מכיוון שמצופה כאן לקבל מימוש של Comparator&lt;Sudent&gt;.אם ה-BODY מכיל רק return statement ניתן להשמיט את המילה return ואת הסוגריים המסולסלות מסביב ל-body. הקומפיילר יבין לבד שזה ערך שצריך להחזיר.
  • #13 עכשיו נסתכל על דוגמאות פרקטיותונראה איך ביטויי למבדה עוזרים להשיג שיפור בביצועים
  • #14 לולאת הפור שבדוגמא מקבלת רשימה של סטודנטים, מתוך הרשימה לוקחת רק סטודנטים שסיימו בשנת 2011 ומחזירה את הציון המקסימלי של מתוך תת קבוצה זו של סטודנטים.הלולאה מתארת במדויק מה לעשות וגם איך לעשות את זה.הלולאה מתארת במדויק את האיטרציה על הרשימה. המימוש הוא חיצוני – נמצא בגוף הקוד.אין פה אפשרות להשתמש במקביליות. אנחנו עוברים על האלמנטים בצורה סידורית אחד אחרי השני.
  • #15 לולאת הפור שבדוגמא מקבלת רשימה של סטודנטים, מתוך הרשימה הלולאה לוקחת רק סטודנטים שסיימו בשנת 2011 ומחזירה את הציון המקסימלי של תת קבוצה זו.הלולאה מתארת במדויק מה לעשות וגם איך לעשות את זה.הלולאה מתארת במדויק את האיטרציה על הרשימה. המימוש הוא חיצוני – הוא נמצא בגוף הקוד.אין פה אפשרות להשתמש במקביליות. אנחנו עוברים על האלמנטים בצורה סידורית אחד אחרי השני.
  • #16 זה קוד שעושה את אותו הדבר שראינו בלולאת הלופ. עם שימוש בביטויי למבדההקוד הזה משתמש ב-3 מתודות חדשות שיהיו חלק מהאינטרפייסList ב – Java 8.אלו מתודות שנמצאות בשימוש נפוץ בשפות פונקציונליות מי שתכנת פעם בשפה פונקציונליות בטח מכיר לפחות את חלקן.כל אחת מהמתודות האלו מקבלת פונקציה בתור פרמטר. אנחנו מבטאים את הפונקציות האלו בעזרת ביטויי למבדה.Filter – מקבלת פונקציה שמחזירה בוליאן. מחזירה תת-רשימה המכילה רק איברים עבורם הפונקציה החזירה TRUE.Map – מקבלת פונקציה שמחזירה אובייקט (במקרה שלנו Integer), מפעילה את הפונקציה על כל איבר ברשימה ומחזירה רשימה של הערכים המוחזרים.Reduce – מקבלת פונקציה שאותה היא מפעילה על כל איבר ברשימה ביחד עם התוצאה של ההפעלה הקודמת – בסוף מחזירה ערך יחיד (לא רשימה).במקרה שלנו הפונקציה שהיא מקבלת היא למעשה MAX – כלומר מחזירה את הערך המקסימלי מבין שני איטנג&apos;רים.אחרי הפעלה על רשימה של אינטג&apos;רים יחזור המספר המקסימלי.ביוטי למבדה מתאר מה לעשות ולא איך. המימוש הוא פנימי לספרייה. כאן המימוש יהיה בתוך מחלקה שמממשת את List.המימוש יכול להשתמש במקביליות – אפשר לחלק את הרשימה בדוגמא לתתי רשימות ולעבור עליהן במקביל.המימוש יכול להשתמש בלייזיאיניטיאליזיישן – למשל Map– יכול להחזיר רשימה שרק כשיבצעו עליה get תופעל הפונקציה עבור האיבר המבוקש.
  • #17 עכשיו נסתכל על דוגמאות פרקטיותונראה איך ביטויי למבדה עוזרים להשיג שיפור בביצועים
  • #18 קריאות – ביטוי למבדה מתאר באופן ברור העבודה שצריך לבצע.די לבוילרפלייט – ברוב המקרים בהם השתמשנו באנונימוסאינר קלאס ניתן להשתמש במקום זאת בביטויי למבדה שהם קצרים יותר.ביטוי למבדה מתאר מה לעשות ולא איך לעשות – משאיר את המימוש למפתחי ה-API שזאת המומחיות שלהם.בשילוב עם תמיכה חדשה בספריות של JDK 8 נוכל לכתוב קוד טוב יותר שגם עובד מהר יותר.נסו את זה בבית זה פשוט וכיף – אתם יכולים להוריד כבר היום גרסת בטא של JDK עם תמיכה בביטויי למבדה.