5 פיצ’רים בג’אווה 8 שישנו את האופן שבו אתם מקודדים

5 פיצ׳רים שאתם חייבים להכיר בגרסה החדשה של ג׳אווה

java 8

ג’אווה 8 עמוסה בפיצ’רים משמעותיים – גם ברמת ה-JVM וגם בשפה עצמה. למרות העובדה שחלק מהפיצ’רים שאמורים היו להיכלל בגרסה הזו נדחו לגרסה 9, אך עדיין קיימים עשרות פיצ’רים חדשים. רבים מהם נמצאים בקומפיילר וב-JVM, כלומר מבחינתנו, המפתחים הסטנדרטיים של ג’אווה, הם ממש מאחורי הקלעים. ככאלה, אנחנו נזכה ליהנות מהם גם בלי לבצע פעולות אקטיביות (מלבד להתקין ג’אווה 8 כמובן).

הנה 5 פיצ’רים שאתם חייבים להכיר:

1) Lambda Expressions – “פונקציות למבדא”

אפילו אם לא היינו רוצים להיות מיינסטרימים לגמרי, די ברור כי מנקודת מבט של מפתחים, הפיצ’ר המשמעותי ביותר בג’אווה 8 הוא התמיכה החדשה בפונקציות למבדא. התוספת הזו לשפה מביאה את ג’אווה לחזית התכנות הפונקציונלי, לצד שפות פונקציונליות מבוססות JVM אחרות, כמו Clojure ו-Scala.

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

מומלץ שתכירו את התחביר של הפונקציות הללו, בייחוד באופן שבו הוא מתקשר לפעולות על array ו-collections, בהם פונקציות למדא שולבו עמוק לתוך ספריות הליבה של השפה. סביר מאוד להניח שתתחילו לראות יותר ויותר קוד כמו זה שמוצג כאן למטה גם בספריות צד ג’ וגם בקוד שנכתב בארגון שלכם.

codeSample1

זו דרך יעילה לקבץ collections לפי ערכו של שדה class ספציפי.

2) Parallel operations – תכנות ופעולות מקביליות

יחד עם הוספת פונקציות למדא לפעולות על מערכים, שילבה ג’אווה אלמנט חשוב מאוד במנגנון האיטרציה הפנימית של השפה. כמפתחים, התרגלנו להשתמש בלולאות כאחד הכלים הבסיסיים ביותר בתכנות, יחד עם If ו-Else הנפוצים. ההוספה של פונקציות למדא הפכה את הפרדיגמה הזו על פיה, כשאיטרציה אמיתית על collection שעליו מופעלת פונקציית למדא, מבוצעת כעת על ידי ספריית הליבה עצמה (כלומר איטרציה פנימית).

אפשר לחשוב על זה כעל הרחבה של איטרטורים, שבה פעולת חילוץ האייטם הבא שעליו יש לבצע פעולה מתוך ה-collection מתבצעת באמצעות איטרטור. אפשרות מרשימה שהמבנה הזה מאפשר היא ביצוע אופרציות על מערכים ארוכים (Long arrays) – כמו מיון, פילטור ומיפוי – בו זמנית על ידי התשתית. כאשר עוסקים בקוד שרת שמעבד collections ארוכים באופן קבוע, השינוי הזה יכול להוביל לשיפורים משמעותיים מאוד בביצועים עם עבודה מינימלית מהצד שלכם.

הנה אותו קטע קוד מהסעיף הקודם, אך תוך שימוש בפעולות מקביליות:

codeSample2

נדרש שינוי קטן למדי לאלגוריתם כדי שיהפוך להיות thread safe.

3) ג’אווה + ג’אווה סקריפט = ❤

ג’אווה 8 מנסה לתקן את אחת העוולות ההיסטוריות הגדולות – המרחק שממשיך לגדול בין ג’אווה לג’אווה סקריפט, מרחק שרק המשיך לצמוח בשנים האחרונות. הגרסה החדשה מציגה מנוע JVM חדש לג’אווה סקריפט בשם Nashorn. המנוע החדש עושה שימוש ייחודי בכמה מהפיצ’רים שהוכנסו לג’אווה 7, כמו למשל invokeDynamic, כדי לזרז את ביצועי הג’אווה סקריפט ברמת ה-JVM, ממש כמו V8 ו-Spidermonkey.

משמעות השינוי היא שבפעם הבאה שאתם מחפשים לבצע אינטגרציה של JS לשרת, במקום להרים יישות של node.js, פשוט תוכלו להשתמש ב-JVM כדי להריץ את הקוד. בונוס נוסף הוא ההתאמה הפשוטה בין הקוד שלכם בג’אווה ובג’אווה סקריפט, בלי שתצטרכו להשתמש במתודות IPC/RPC כדי לגשר על הפער.

4) ממשקי התאריך והזמן (Date and time API)

המורכבות הגדולה של הספריות הנוכחיות גרמה כאבי ראש ללא מעט מפתחים במשך שנים רבות. בשנים האחרונות מילא את החלל Joda time, ויחד עם ג’אווה 8 עלתה השאלה המיידית מדוע Joda לא אומצה כספריית הזמן הדיפולטיבית. למעשה, בגלל מה שנתפס כפגם בארכיטקטורה של Joda, פותח API חדש לגמרי לג’אווה 8. החדשות הטובות הן שבניגוד ל-()Calendar.getInstance, ה-API החדשים תוכננו במטרה להיות פשוטים, יחד עם ממשק ידידותי לביצוע מניפולציות על פורמטים של זמן בשפה שגם בני אדם וגם מכונות יכולים לקרוא ו”לתרגם”.

5) Concurrent accumulators

אחד התרחישים הנפוצים ביותר בתכנות מקבילי הוא עדכון קאונטרים. במהלך השנים היו לא מעט דרכים עקיפות לעשות את זה, החל מבלוקים מסונכרנים, דרך מנעולי קריאה/כתיבה ועד AtomicInteger. ובעוד ה-AtomicIntegers יעילים יותר (נסמכים ישירות על פעולות CAS של המעבד), נדרשת רמה גבוהה של היכרות על מנת לממש את הסמנטיקה הנחוצה.

בג’אווה 8 הבעיה הזו נפתרה ברמת התשתית, עם ה-Longaccumulator classes החדשים, אשר תומכים בהוספה/הפחתה יעילה בערך של קאונטר, באופן שהוא Thread safe. במקרה הזה לא באמת מדובר בשאלה של טעם או העדפה – שימוש במחלקות החדשות הללו הוא כמעט הכרח.

<<< לפוסט קודם: כך תבנו שאלה מצויינת ב-Stackoverflow (על בסיס 10,000 שאלות)

הפוסט פורסם לראשונה באנגלית בבלוג של Takipi.

 

טל וייס

טל וייס הוא מצוות המייסדים והמנכ”ל של טקיפי (Takipi), סטארטאפ העוזר למתכנתים להבין מה גרם לשגיאות בקוד. אוהב אתגרים תכנותיים, באגים לא פתירים ותכנות low level. כשהוא לא עסוק בתכנות או בסטארטאפ הוא מנגן בתופים.

הגב

10 Comments on "5 פיצ’רים בג’אווה 8 שישנו את האופן שבו אתם מקודדים"

avatar
Photo and Image Files
 
 
 
Audio and Video Files
 
 
 
Other File Types
 
 
 
Sort by:   newest | oldest | most voted
הארכיטקט
Guest

איזה פער לעזאזל?! שפות שונות עם יעדים שונים. תבדוק את מה שאתה כותב לפני שאתה כותב. וזה למבדא, lambda, ולא למדא או labmda.

תל
Guest

תיקון, Lambda ולא Labmda, ובעברית למבדה (או א’, לא קריטי), לא למדא. הוגים את הב’ בחרישות..

איריס שור
Member

תוקן, תודה

thepoosh
Guest

אולי הכותב המוצלח יוכל להסביר לי מתי בדיוק JS הייתה אפילו באיזור הקרוב של Java.

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

אין שום קשר ביניהן, לא היה שום קשר ביניהן אף פעם והשם של JS הוא סוג של בדיחה של המפתח.

דברים מהסוג הזה מקשים מאוד לקחת ברצינות את מה שאתה כותב

איריס שור
Member

הכוונה לא היתה שג’אווה מתקרבת ל JS (יש את השאלה המפורסמת מ StackOverflow על ההבדל בינהם – http://stackoverflow.com/questions/245062/whats-the-difference-between-javascript-and-java).

הכוונה היא שמפתחים שעובדים עם שתי השפות בו זמנית (בדר”כ אחת ל frontend והשניה ל backend), או רק עם JS, יכולים להריץ JS באופן יותר יעיל דרך ה JVM.

פעם תכנת בג'אווה
Guest
פעם תכנת בג'אווה

קודם כל תודה על הכתבה המענינת על התפתחות שפת ג’אווה,
פעם תיכנתי בג’ווה לצערי כיום בעבודתי מתכנתים בשפות אחרות,
כמה הערות “Labmda Expressions”
התרגום של זה עד כמה שאני מבין יהיה “ביטויי – למבדה או למבדא” העיקר שיהיה (ב)
ולא פונקציות למדא,
יש חשיבות בשפות ולנסות להשתמש במושגים הכי מדויקים גם כך זה מורכב מאד,
הרבה מאיתנו חוטאיים בזה כולל אני
ואז יכולת תעבורת הנתונים בין אדם אחד לשני לוקה בחסר,
כאשר השיחה הרגילה בין תכנתיים היא תפעיל את זה ומשם את הדבר הזה ואת זה.

jealous
Guest

תודה רבה על המידע השימושי והמעניין.
אני לא מבין על מה יצא קצפם של המגיבים השונים…
אולי הם רואים יותר מדי אקזיטים כשהם תקועים עדיין בגיל 50 באיזה קיוביקל מסריח עם אופק לפנסיה בקיבוץ..

יוחנן
Guest

לא, המגיבים לא מקנאים, פשוט לא אוהבים שכתבות מלאות בשטויות (ראה ערך: הכתבה על hack שהיתה פה לא מזמן) מופיעות בעמוד הראשי. ניוזגיק, תעשו article review הכי בסיסי, זה מביך לשחרר תוכן כזה.

אבישי
Guest
java כבר שפה שהעלתה אבק ולא זכתה לשום שדרוג משמעותי בתקופה האחרונה, גם העדכון הנוכחי הוא לא יותר מאשר פלסטר להדביק את השוק. נראה שאורקל קנתה את זה בשביל לעשות קצת כסף מהתקנות של סרגלי כלים כמו ask, או לקחת כסף על רשיונות או תביעות פטנטים. בדרך היא שכחה שגם צריך להשקיע בשפה. בשורה התחתונה – הדברים שמגיעים עכשיו לג’אווה כבר היו לפני מספר שנים ב.net, תכנות מקבילי – כבר מלפני כמה שנים ב-.net, עדיין חסרים הרבה דברים כמו task, await, async וכו’, עכשיו יבואו כמה אנשים ויגידו לי שזה בחינם, שזה רץ על כל פלטפרומה וכו’ התשובה שלי לכל… Read more »
מייקי
Guest

גם #C היא Cross-Platform , בדיוק כמו Java. אבל פלטפורמת ה Net. לא.
עם זאת, יש למשל את Mono ששוברת כמה מכשולים…ו WinRT היא Cross-Platform בין מוצרי מייקרוסופט (Windows, WindowsRT, Xbox One, Windows Phone, Windows Azure).

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

עדיין, השאלה היא לאיזה פלטפורמות הם מכוונים.

wpDiscuz

תגיות לכתבה: