רגע לפני: JAVA 8 וביטויי למבדה, כיצד צפויים להשפיע עליכם?

ג’אווה 8 כבר כמעט כאן וזה הזמן להתחיל ללמוד על השינויים והמעבר מג’אווה 7. גל מרדר מעניק לנו טעימה ראשונה על קצה המזלג

הפוסט נכתב על ידי גל מרדר, מנכ”ל טריינולוג’יק ומנהל תחום Java בג’ון ברייס מכללת הי-טק – בעל ניסיון של 15 שנים בעולם הפיתוח, מתמחה בעולם ה-JAVA ומשמש כיועץ לחברות מובילות בתחום, בארץ ובעולם.

יח”צ

כבר ב-Java 7 נערך דיון סוער בשאלה האם להכניס תמיכה בביטויי למבדה לתוך השפה. בתחילה הוחלט שכן ולאחר מכן, עם רכישת אורקל את סאן, הוחלט להקטין את היקף השינויים ב-Java 7 ולדחות את התמיכה בביטויי למבדה לגרסה 8. מאחר וגרסה 8 כבר מעבר לפינה הגיע הזמן להתעמק קצת בביטויי למבדה ולהבין איך הם הולכים להשפיע עלינו כמפתחי Java.

מה זה בכלל ביטוי למבדה?

ההגדרה בוויקיפדיה אומרת: תחשיב למְבְּדא הוא צורה לוגית – פורמלית ריגורוזית להצגה וטיפול בפונקציות במתמטיקה ומדעי המחשב. הדרך הפשוטה יותר להסביר מה זה ביטוי למבדה למפתח בשפה מונחית עצמים היא פונקציה אנונימית. פשוט פיסת התנהגות שיש לה קלט ופלט, אבל אין לה שם.

כמפתחי Java הדבר הזה קצת מוזר לנו. אנו רגילים שפונקציה חייבת להיות חלק מ-Class. המגבלה הזאת ב-Java לעיתים גורמת לנו לכתוב קוד מיותר ולא אלגנטי בדמות Anonymous inner class. כך לדוגמה כאשר אנחנו רוצים להריץ משהו ב-Thread נפרד לעיתים קרובות אנו מוצאים את עצמנו עם קוד כזה:

new Thread(new Runnable() {

public void run() {

System.out.println(“Print from another thread”);

}

}).start();

ישנן לא מעט סיטואציות נפוצות שגורמות לנו לכתוב קוד שכזה; הפעלת Thread היא דוגמה אחת, Listeners ב-Swing היא עוד דוגמה נוספת ונפוצה וישנן כמובן דוגמאות נוספות.

תארו לכם מצב שפונקציה, או לפחות מימוש של פונקציה, היה משהו שאפשר להעביר כפרמטר למתודה. עכשיו אתם יכולים להפסיק לדמיין. זה בדיוק מה שביטויי למבדה מאפשרים לנו לעשות. המקבילה של הקוד בקטע קוד מספר 1, תראה כך ברגע שתהיה תמיכה בביטיי למבדה:

new Thread(() -> System.out.println(“Print from another thread”)).start();

הסינטקס הכללי של ביטויי למבדה מורכב מרשימת פרמטרים המוקפת בסוגריים, לאחריה חץ, ולאחריו גוף הביטוי מוקף בסוגריים מסולסלים:

(String param1, int param2) -> {expression1; expression2;}

זהו המבנה הכללי, אבל ישנם גם לא מעט יוצאי דופן. למשל, כאשר יש רק פרמטר אחד, אין צורך בסוגריים:

param1 -> {expression1; expression2;}

כאשר יש רק ביטוי אחד, אין צורך בסוגריים מסולסלים:

param1 -> expression1;

במידה וסוגי הפרמטרים הלא מוצהרים בשורת הפרמטרים, הם מוסקים באופן אוטומטי ע”י הקומפיילר (Type Inference). שינוי הקוד מועיל, ואכן משפר את האלגנטיות שבקוד, אך בעיני אין זה העיקר. השינוי המהותי שמביאה איתה התמיכה בביטויי למבדה הוא השינוי הקונספטואלי. התמיכה בביטויי למבדה נותנת ל-Java אופי ותכונות של תכנות פונקציונאלי, כזה הרואה בפונקציה מרכיב עיקרי בפיתוח ובעיצוב. כך למשל, כחלק מהשינויים ב-Java 8, ה-Collections עומדים להתרחב ולהכיל מתודות חדשות עם אופי פונקציונאלי כחלק מה-API הבסיסי שלהם.

לדוגמה, המתודה הבאה תאפשר לנו לסנן החוצה מתוך ה-Collection כל איבר הקטן מ-0:

List filteredList = originalList.filter((elem) -> elem > 0)

לאלה מכם שבעקבות השינוי ב-Collections כבר חוששים לגבי התמיכה בגרסאות קודמות, גם לזה יש תשובה בדמות תכונה חדשה הנקראת Extension Methods, אבל זה כבר נושא למאמר אחר.

עם היתרונות שיש בביטויי למבדה ישנם גם חסרונות. יש הטוענים כי ביטויי למבדה מעלים בצורה מהותית את מורכבות השפה ועל כן מקשים את האימוץ שלה ע”י מפתחים מתחילים. מאז ומתמיד Java חרטה על דגלה את הסיסמה Java is Simple, יש הטוענים ש-Java 8 כבר אינה עומדת מאחורי האמירה הזאת.


הפוסט נכתב על ידי ג’ון ברייס מכללת הייטק


רוצים לשמוע יותר? הירשמו לסמינר What’s new in Java 7 and a sneak peek to Java 8 אשר יערך ב-25.7

ג’ון ברייס מכללת הי-טק וטריינולוג’יק מזמינות אותך להיחשף, לפתח להוביל ולשדרג את היכולות שלכם. שריינו את מקומכם עוד היום בכנס המקצועי המוביל למפתחים בסביבת Java הכולל את מיטב המרצים ובעל ערך לימודי טהור עם מגוון סדנאות מקצועיות בנושאים מגוונים כגון: Java Concurrency | Scala | Spring | CDI | Grails | Akka  ExtJS  | NoSQL and Big Data with MongoD.

כנס JDEV2012 יערך בין התאריכים 25.7 ל-26.7 במלון דניאל בהרצליה לפרטים נוספים ולהרשמה הקליקו כאן.

כתב אורח

אנחנו מארחים מפעם לפעם כותבים טכנולוגים אורחים, המפרסמים כתבות בתחומי התמחות שלהם. במידה ואתם מעוניינים לפרסם פוסט בשמכם, פנו אלינו באמצעות טופס יצירת קשר באתר.

הגב

21 Comments on "רגע לפני: JAVA 8 וביטויי למבדה, כיצד צפויים להשפיע עליכם?"

avatar
Photo and Image Files
 
 
 
Audio and Video Files
 
 
 
Other File Types
 
 
 
Sort by:   newest | oldest | most voted
Benny Shwartz
Guest

lambda היא לא דבר חדש כמה שנים טובות, דרך Linq בסביבת הפיתוח של מייקרוסופט (.net 3.5 ומעלה)..

Miky Lestat
Guest
המאמר קצר ומדי ומרגיש לא שלם. אפשר לעשות הרצאות שלמות ולכתוב מאמרים שלמים ( ויש כאילה משני הסוגים ) על Lamda Expressions ו Closures בכלל, ובפרט ב Java והשפעתם לטובה ולרעה. בגלל ש Java רוצה להיות "שפה פשוטה" היא הפכה להיות ההפך. מהסיבה הפשוטה ש "פשוט" זה לא בהכרח אינטואטיבי. שפות אחרות כמו Python ו #C כבר מזמן יותר אינטואטיביות למתחילים ( וגם למתקדמים ). ומצד שני, למה שמתכנת מתחיל ירצה ללמוד Lamda Expressions ? ב Java 8 יש עוד חידושים מסעירים ומשמעותיים לשפה. למשל, נפטרנו מטיפוסים פרימיטיביים. בכל אופן, למי שרוצה, יש פה את הפוסט הרשמי והשלם לגבי Lambda… Read more »
Shai Deshe
Guest

*lambda

Shlomi Borovitz
Guest

"תארו לכם מצב שפונקציה, או לפחות מימוש של פונקציה, היה משהו שאפשר להעביר כפרמטר למתודה"
חשב לעצמו כל מתכנת שהתעסק אי פעם ב-C…

wait! what??

ואני לא אתפלא אם אי שם בשנת 2006 או 7, יצא פוסט זהה על C#… בעצם לא זהה…

ועכשיו אני שואל, איזו שפה הפכה להיות חיקוי עלוב של איזו שפה?

Yariv Nissim
Guest

sounds like blocks (in ObjC, maybe other languages)

Shlomi Borovitz
Guest

להעביר פונקציה כפרמטר קיים בהרבה שפות והרבה שנים…
אין לי מושג איך זה נקרא ב-objC, אבל כיוון שהיא מבוססת על C, וב-C זה קיים (כ-function pointer), כנראה שזה קיים גם ב-objC…

Shlomi Borovitz
Guest

להעביר פונקציה כפרמטר קיים בהרבה שפות והרבה שנים…
אין לי מושג איך זה נקרא ב-objC, אבל כיוון שהיא מבוססת על C, וב-C זה קיים (כ-function pointer), כנראה שזה קיים גם ב-objC…

Igal Pines
Guest

ג'וניור, נראה לי אתה קורא את הכתבות הלא נכונות של הכותבים הלא נכונים.

אני לא מתכנת בג'אווה, אבל בג'אווה סקריפט זה קיים ב15 שנה האחרונות. אולי גם לפני.

גם ב
PHP
זה קיים מאז שאני זוכר את עצמי.

Igal Pines
Guest

ג'וניור, נראה לי אתה קורא את הכתבות הלא נכונות של הכותבים הלא נכונים.

אני לא מתכנת בג'אווה, אבל בג'אווה סקריפט זה קיים ב15 שנה האחרונות. אולי גם לפני.

גם ב
PHP
זה קיים מאז שאני זוכר את עצמי.

Shlomi Borovitz
Guest

יגאל, הרשה לי לחדש לך – למעט השם, וקונבנציות לשמות – שתי השפות שונות לחלוטין

JavaScript copies many names and naming conventions from Java, but the two languages are otherwise unrelated and have very different semantics

(מתוך ויקי)

Jonathan Levison
Guest

Java in the new cobol

Shlomi Borovitz
Guest

העצוב הוא שזה קיים גם בקובול…

Omer Levy
Guest

לא רק בקובול – גם בסקים! חחח (ואפילו זה נקרא lambda)

Idan Hazan
Guest

אמנם זה מגיע באיחור… אבל עדיף מאוחר מאשר אף פעם

Dudu Mahabad
Guest

חביל שעדיין אין jre se לשום פלטפורמת mobile , העולם צועד קדימה ובאורקל ממשיכים להתעסק עם הביטויים האלה

Hanoch Mahabad
Guest

הוצאת לי את המילים מהפה……….. ;)

Dudu Mahabad
Guest

תרגום לשפה פשוטה:תפסיקו להתעסק בשטויות ותתחילו לתת תוכנות שעובדות

Ram Nathaniel
Guest

מיותר לגמרי – אין כאן שום שיפור מהותי, וזה רק מסבך את השפה.
חבל שכדי לרדוף אחרי טרנדים מסבכים עניינים.

אלי
Guest

לפי התגובות פה רואים שאף אחד פה לא התנסה בLinq בC#. שורה אחת עוצמית וקלה לקריאה בתכנות פונקציואנלי מחליפה עשרות שורות קוד מגעילות במכה (אך במחיר קל של Overhead)

חשוב – תכנות פונקציואנלי זה משהו הרבה יותר עמוק מלהעביר פוינטר לפונקציה כמו בסי. מדובר בדרך חשיבה שונה לגמרי בתכנות – תסתכלו על קודים של LISP למשל – שהיא שפה פונקציואנלית נטו – ותראו על מה מדובר.

נ.ב
ממש לא פשוט להבין קוד של LISP בלי רקע.

סטארטפיסט
Guest

לא הייתי צוחק על ג’אווה בשום צורה שהיא אם הייתי “מתכנת\טכנולוג” ב .NET
זה שהשפה הנפלאה C# של מיקרוסופט יוצרת דברים חלוצים זה רק בשביל האינטרסים האישיים שלה על מנת לייצר סטיקינס, זה לא אומר שהיא יותר טובה, זה רק אומר שאנשים הולכים שבי אחרי כל השפה\החבילה של מיקרוסופט שעולה הון תועפות ולא פורטבילית אם שום דבר!!!
נראה אתכם חכמים גדולים כותבים מערכת גדולה ומורכבת עם הסביבה שלהם, תצפו לעלויות מטורפות ולכאבי גדילה שאפשר לפתור רק בעזרת עוד כסף!
נקודה למחשבה…

Someone
Guest

Groovy > Java 8
Closures > Lambda Exps
Oh and, .NET == Crap

wpDiscuz

תגיות לכתבה: