רגע לפני: 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 תגובות על "רגע לפני: JAVA 8 וביטויי למבדה, כיצד צפויים להשפיע עליכם?"
* היי, אנחנו אוהבים תגובות!
תיקונים, תגובות קוטלות וכמובן תגובות מפרגנות - בכיף.
חופש הביטוי הוא ערך עליון, אבל לא נוכל להשלים עם תגובות שכוללות הסתה, הוצאת דיבה, תגובות שכוללות מידע המפר את תנאי השימוש של Geektime, תגובות שחורגות מהטעם הטוב ותגובות שהן בניגוד לדין. תגובות כאלו יימחקו מייד.
lambda היא לא דבר חדש כמה שנים טובות, דרך Linq בסביבת הפיתוח של מייקרוסופט (.net 3.5 ומעלה)..
*lambda
"תארו לכם מצב שפונקציה, או לפחות מימוש של פונקציה, היה משהו שאפשר להעביר כפרמטר למתודה"
חשב לעצמו כל מתכנת שהתעסק אי פעם ב-C…
wait! what??
ואני לא אתפלא אם אי שם בשנת 2006 או 7, יצא פוסט זהה על C#… בעצם לא זהה…
ועכשיו אני שואל, איזו שפה הפכה להיות חיקוי עלוב של איזו שפה?
sounds like blocks (in ObjC, maybe other languages)
להעביר פונקציה כפרמטר קיים בהרבה שפות והרבה שנים…
אין לי מושג איך זה נקרא ב-objC, אבל כיוון שהיא מבוססת על C, וב-C זה קיים (כ-function pointer), כנראה שזה קיים גם ב-objC…
להעביר פונקציה כפרמטר קיים בהרבה שפות והרבה שנים…
אין לי מושג איך זה נקרא ב-objC, אבל כיוון שהיא מבוססת על C, וב-C זה קיים (כ-function pointer), כנראה שזה קיים גם ב-objC…
ג'וניור, נראה לי אתה קורא את הכתבות הלא נכונות של הכותבים הלא נכונים.
אני לא מתכנת בג'אווה, אבל בג'אווה סקריפט זה קיים ב15 שנה האחרונות. אולי גם לפני.
גם ב
PHP
זה קיים מאז שאני זוכר את עצמי.
ג'וניור, נראה לי אתה קורא את הכתבות הלא נכונות של הכותבים הלא נכונים.
אני לא מתכנת בג'אווה, אבל בג'אווה סקריפט זה קיים ב15 שנה האחרונות. אולי גם לפני.
גם ב
PHP
זה קיים מאז שאני זוכר את עצמי.
יגאל, הרשה לי לחדש לך – למעט השם, וקונבנציות לשמות – שתי השפות שונות לחלוטין
JavaScript copies many names and naming conventions from Java, but the two languages are otherwise unrelated and have very different semantics
(מתוך ויקי)
Java in the new cobol
העצוב הוא שזה קיים גם בקובול…
לא רק בקובול – גם בסקים! חחח (ואפילו זה נקרא lambda)
אמנם זה מגיע באיחור… אבל עדיף מאוחר מאשר אף פעם
חביל שעדיין אין jre se לשום פלטפורמת mobile , העולם צועד קדימה ובאורקל ממשיכים להתעסק עם הביטויים האלה
הוצאת לי את המילים מהפה……….. ;)
תרגום לשפה פשוטה:תפסיקו להתעסק בשטויות ותתחילו לתת תוכנות שעובדות
מיותר לגמרי – אין כאן שום שיפור מהותי, וזה רק מסבך את השפה.
חבל שכדי לרדוף אחרי טרנדים מסבכים עניינים.
לפי התגובות פה רואים שאף אחד פה לא התנסה בLinq בC#. שורה אחת עוצמית וקלה לקריאה בתכנות פונקציואנלי מחליפה עשרות שורות קוד מגעילות במכה (אך במחיר קל של Overhead)
חשוב – תכנות פונקציואנלי זה משהו הרבה יותר עמוק מלהעביר פוינטר לפונקציה כמו בסי. מדובר בדרך חשיבה שונה לגמרי בתכנות – תסתכלו על קודים של LISP למשל – שהיא שפה פונקציואנלית נטו – ותראו על מה מדובר.
נ.ב
ממש לא פשוט להבין קוד של LISP בלי רקע.
לא הייתי צוחק על ג’אווה בשום צורה שהיא אם הייתי “מתכנת\טכנולוג” ב .NET
זה שהשפה הנפלאה C# של מיקרוסופט יוצרת דברים חלוצים זה רק בשביל האינטרסים האישיים שלה על מנת לייצר סטיקינס, זה לא אומר שהיא יותר טובה, זה רק אומר שאנשים הולכים שבי אחרי כל השפה\החבילה של מיקרוסופט שעולה הון תועפות ולא פורטבילית אם שום דבר!!!
נראה אתכם חכמים גדולים כותבים מערכת גדולה ומורכבת עם הסביבה שלהם, תצפו לעלויות מטורפות ולכאבי גדילה שאפשר לפתור רק בעזרת עוד כסף!
נקודה למחשבה…
Groovy > Java 8
Closures > Lambda Exps
Oh and, .NET == Crap