שאלות על ראיונות עם Java 8 (+ תשובות)

מאמר זה הוא חלק מסדרה: • שאלות ראיונות בנושא אוספי Java

• שאלות בנושא ראיונות מערכת מסוג Java

• שאלות על ראיונות במקביל ל- Java (+ תשובות)

• שאלות על ראיונות מבנה כיתת Java ו אתחול

• Java 8 שאלות ראיונות (+ תשובות) (מאמר נוכחי) • ניהול זיכרון בשאלות ראיון Java (+ תשובות)

• שאלות ראיונות עם Java Generics (+ תשובות)

• שאלות ראיונות עם בקרת זרימת Java (+ תשובות)

• שאלות על ראיונות חריגים עם Java (+ תשובות)

• שאלות ראיונות בהערות Java (+ תשובות)

• שאלות על ראיונות מסגרת האביב המובילה

1. הקדמה

במאמר זה, אנו הולכים לחקור כמה מהשאלות הקשורות ל- JDK8 העשויות לצוץ במהלך ראיון.

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

2. Java 8 ידע כללי

שאלה 1. אילו תכונות חדשות נוספו בג'אווה 8?

Java 8 נשלח עם כמה תכונות חדשות, אך המשמעותיות ביותר הן:

  • ביטויים למבדה - תכונת שפה חדשה המאפשרת להתייחס לפעולות כאובייקטים
  • הפניות לשיטה - אפשר להגדיר ביטויים למבדה על ידי התייחסות לשיטות ישירות תוך שימוש בשמותיהן
  • אופציונאלי - שיעור עטיפה מיוחד המשמש לביטוי אופציונליות
  • ממשק פונקציונלי - ממשק עם שיטה מופשטת לכל היותר, ניתן לספק יישום באמצעות ביטוי למבדה
  • שיטות ברירת מחדל - תן לנו את היכולת להוסיף יישומים מלאים בממשקים מלבד שיטות מופשטות
  • Nashorn, מנוע JavaScript - מנוע מבוסס Java לצורך ביצוע והערכת קוד JavaScript
  • זרם ממשק API - מעמד איטרטור מיוחד המאפשר עיבוד אוספים של אובייקטים באופן פונקציונלי
  • ממשק API לתאריך - API משופר בהשראת JodaTime, שאינו משתנה

לצד התכונות החדשות הללו, הרבה שיפורים בתכונות נעשים מתחת למכסה המנוע, הן במהדר והן ברמת JVM.

3. הפניות לשיטה

שאלה 1. מהי הפניה לשיטה?

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

(o) -> o.toString ();

יכול להיות:

אובייקט :: toString ();

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

מחרוזת :: חדש;

התייחסות לשיטה סטטית:

מחרוזת :: valueOf;

הפניה לשיטת מופע מאוגד:

str :: toString;

הפניה לשיטת מופע לא מאוגד:

מחרוזת :: toString;

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

שאלה 2. מה המשמעות של מחרוזת :: ערך ביטוי?

זוהי התייחסות לשיטה סטטית ל- ערך של שיטת ה- חוּט מעמד.

4. אופציונלי

שאלה 1. מה זה אופציונאלי? כיצד ניתן להשתמש בו?

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

אופציונאלי יש מיוחד Optional.empty () ערך במקום עטוף ריק. לפיכך ניתן להשתמש בו במקום בערך בטל להיפטר ממנו NullPointerException במקרים רבים.

תוכלו לקרוא מאמר ייעודי אודות אופציונאלי פה.

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

למשל, ה Stream.min () השיטה מחשבת את הערך המינימלי בזרם ערכים. אבל מה אם הזרם ריק? אם זה לא היה בשביל אופציונאלי, השיטה תחזור ריק או לזרוק חריג.

אבל זה מחזיר אופציונאלי ערך שעשוי להיות Optional.empty () (המקרה השני). זה מאפשר לנו לטפל בקלות במקרה כזה:

int min1 = Arrays.stream (int int [] {1, 2, 3, 4, 5}) .min () .orElse (0); assertEquals (1, min1); int min2 = Arrays.stream (int int [] {}) .min () .orElse (0); assertEquals (0, min2); 

ראוי לציין זאת אופציונאלי אינו כיתת מטרה כללית כמו אוֹפְּצִיָה בסקאלה. לא מומלץ להשתמש כערך שדה בכיתות ישויות, מה שמצוין בבירור בכך שהוא לא מיישם את ניתן לבצע סדרתי מִמְשָׁק.

5. ממשקים פונקציונליים

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

יש הרבה ממשקים פונקציונליים ב java.util.function החבילה, הנפוצות יותר כוללות אך לא מוגבלות ל:

  • פוּנקצִיָה - זה לוקח טיעון אחד ומחזיר תוצאה
  • צרכן - זה לוקח טיעון אחד ולא מחזיר שום תוצאה (מייצג תופעת לוואי)
  • ספק - זה לא לוקח ויכוח ומחזיר תוצאה
  • לְבַסֵס - זה לוקח ויכוח אחד ומחזיר בוליאני
  • BiFunction - זה לוקח שני טיעונים ומחזיר תוצאה
  • BinaryOperator - זה דומה ל- BiFunction, לוקח שני ויכוחים ומחזיר תוצאה. שני הטיעונים והתוצאה הם מאותם סוגים
  • UnaryOperator - זה דומה ל- פוּנקצִיָה, לוקח ויכוח יחיד ומחזיר תוצאה מאותו סוג

למידע נוסף על ממשקים פונקציונליים, עיין במאמר "ממשקים פונקציונליים ב- Java 8".

שאלה 2. מהו ממשק פונקציונלי? מהם הכללים להגדרת ממשק פונקציונלי?

ממשק פונקציונלי הוא ממשק עם שיטה מופשטת אחת לא יותר, לא פחות אלא אחת (בְּרִירַת מֶחדָל שיטות לא נחשבות).

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

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

למשל, ה ניתן לרוץ ממשק הוא ממשק פונקציונלי, אז במקום:

שרשור הברגה = שרשור חדש (חדש ניתן להריצה () {ריצה ציבורית ריקה () {System.out.println ("שלום עולם!");}});

אתה יכול פשוט לעשות:

שרשור הברגה = שרשור חדש (() -> System.out.println ("שלום עולם!"));

ממשקים פונקציונליים מסומנים בדרך כלל עם ה- @FunctionalInterface ביאור - שהוא אינפורמטיבי ואינו משפיע על הסמנטיקה.

6. שיטת ברירת מחדל

שאלה 1. מהי שיטת ברירת מחדל ומתי אנו משתמשים בה?

שיטת ברירת מחדל היא שיטה עם יישום - אשר ניתן למצוא בממשק.

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

ממשק ציבורי רכב {מהלך ריק (ציבורי) (); ברירת מחדל ריק () {System.out.println ("מציץ!"); }}

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

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

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

שאלה 2. האם יתקיים הקוד הבא?

ממשק ציבורי ממשק ציבורי @FunctionalInFace פונקציה 2 {חלה על V (T t, U u); ספירת חלל ברירת מחדל () {// מונה תוספת}}

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

7. ביטויים למבדה

שאלה 1. מהו ביטוי למבדה ולמה הוא משמש

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

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

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

שאלה 2. הסבר את התחביר ואת המאפיינים של ביטוי למבדה

ביטוי למבדה מורכב משני חלקים: חלק הפרמטר וחלק הביטויים מופרדים על ידי חץ קדימה כמפורט להלן:

פאראמים -> ביטויים

לכל ביטוי למבדה יש ​​את המאפיינים הבאים:

  • הצהרת סוג אופציונלית - כאשר אנו מצהירים על הפרמטרים בצד שמאל של הלמדה, איננו צריכים להכריז על סוגיהם שכן המהדר יכול להסיק אותם מערכיהם. כך int param -> ... ו param -> ... כולם תקפים
  • סוגריים אופציונליים - כאשר רק פרמטר אחד מוכרז, איננו צריכים להציב אותו בסוגריים. זה אומר param -> ... ו (param) -> ... כולם תקפים. אך כאשר מוכרזים יותר מפרמטר אחד, נדרשים סוגריים
  • סוגריים מתולתלים אופציונליים - כאשר לחלק הביטויים יש אמירה אחת בלבד, אין צורך בפלטה מתולתלת. זה אומר ש param -> הצהרה ו param -> {הצהרה;} כולם תקפים. אך נדרשים פלטה מתולתלת כאשר יש יותר מאמירה אחת
  • הצהרת החזר אופציונלית - כאשר הביטוי מחזיר ערך והוא עטוף בתוך סוגריים מסולסלים, אז איננו זקוקים להצהרת החזרה. זה אומר (a, b) -> {החזר a + b;} ו (a, b) -> {a + b;} שניהם תקפים

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

8. Navorn Javascript

שאלה 1. מה זה Nashorn ב- Java8?

Nashorn הוא מנוע עיבוד ה- Javascript החדש לפלטפורמת Java שנשלח עם Java 8. עד ל- JDK 7 השתמשה פלטפורמת Java ב- Mozilla Rhino לאותה מטרה. כמנוע לעיבוד Javascript.

Nashorn מספקת תאימות טובה יותר למפרט JavaScript המנורמל של ECMA וביצועי זמן ריצה טובים יותר מקודמו.

שאלה 2. מה זה JJS?

ב- Java 8, jjs הוא כלי ההפעלה או שורת הפקודה החדש המשמש לביצוע קוד Javascript במסוף.

9. זרמים

שאלה 1. מה זה זרם? במה זה שונה מאוסף?

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

הזרם מייצג רצף של אובייקטים ממקור כמו אוסף, התומך בפעולות צבירות. הם נועדו להפוך את עיבוד האיסוף לפשוט ותמציתי. בניגוד לאוספים, ההיגיון של איטרציה מיושם בתוך הזרם, כך שנוכל להשתמש בשיטות כמו מַפָּה ו flatMap לביצוע עיבוד הצהרתי.

הבדל נוסף הוא שה- זרם API שוטף ומאפשר צנרת:

sum sum = Arrays.stream (int int [] {1, 2, 3}) .filter (i -> i> = 2) .map (i -> i * 3) .sum ();

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

שאלה 2. מה ההבדל בין פעולות ביניים ומסוף?

פעולות הזרמה משולבות בצינורות לעיבוד זרמים. כל הפעולות הן ביניים או סופניות.

פעולות ביניים הן הפעולות שחוזרות זרם עצמה מאפשרת פעולות נוספות בזרם.

פעולות אלה תמיד עצלות, כלומר אינן מעבדות את הזרם באתר השיחה, פעולת ביניים יכולה לעבד נתונים רק כאשר יש פעולת מסוף. חלק מפעולות הביניים הן לְסַנֵן, מַפָּה ו flatMap.

פעולות המסוף מסיימות את הצינור ומתחילות עיבוד זרם. הזרם מועבר בכל פעולות הביניים במהלך שיחת מבצע מסוף. פעולות המסוף כוללות לכל אחד, להפחית, לאסוף ו סְכוּם.

כדי להסיע נקודה זו הביתה, הבה נבחן דוגמה עם תופעות לוואי:

main public סטטי ריק (String [] args) {System.out.println ("זרם ללא פעולת מסוף"); Arrays.stream (int int [] {1, 2, 3} חדש). מפה (i -> {System.out.println ("הכפלה" + i); להחזיר i * 2;}); System.out.println ("זרם עם פעולת מסוף"); Arrays.stream (int int [] {1, 2, 3}). מפה (i -> {System.out.println ("הכפלה" + i); להחזיר i * 2;}). Sum (); }

התפוקה תהיה כדלקמן:

זרם ללא הפעלת מסוף זרם עם הפעלת מסוף מכפיל 1 הכפל 2 הכפל 3

כפי שאתה יכול לראות, פעולות הביניים מופעלות רק כאשר קיימת פעולת מסוף.

שאלה 3. מה ההבדל בין מַפָּה ו flatMap מבצע זרם?

יש הבדל בחתימה בין מַפָּה ו flatMap. באופן כללי, א מַפָּה פעולה עוטפת את ערך ההחזרה שלה בתוך הסוג הסדיר שלה בזמן flatMap לא.

לדוגמה, ב אופציונאלי, א מַפָּה המבצע יחזור אופציונאלי הקלד תוך כדי flatMap יחזור חוּט סוּג.

אז לאחר המיפוי, יש לפרוש (לקרוא "לשטח") את האובייקט כדי לאחזר את הערך ואילו לאחר מיפוי שטוח, אין צורך כזה מכיוון שהאובייקט כבר שטוח. אותו מושג מוחל על מיפוי ומיפוי שטוח זרם.

שניהם מַפָּה ו flatMap הן פעולות זרם ביניים המקבלות פונקציה ומחילות פונקציה זו על כל מרכיבי הזרם.

ההבדל הוא שעבור מַפָּה, פונקציה זו מחזירה ערך, אך עבור flatMap, פונקציה זו מחזירה זרם. ה flatMap הפעולה "משטחת" את הזרמים לאחד.

הנה דוגמה שבה אנו לוקחים מפה של שמות המשתמשים ורשימות הטלפונים ו"משטחים "אותה לרשימת טלפונים של כל המשתמשים המשתמשים flatMap:

מַפָּה אנשים = HashMap חדש (); people.put ("ג'ון", Arrays.asList ("555-1123", "555-3389")); people.put ("מרי", Arrays.asList ("555-2243", "555-5264")); people.put ("סטיב", Arrays.asList ("555-6654", "555-3242")); רשימת טלפונים = אנשים.ערכים (). Stream () .flatMap (אוסף :: stream) .collect (Collectors.toList ());

שאלה 4. מהו צינור זרם ב- Java 8?

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

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

אז חייבת להיות פעולת מסוף המחזירה ערך סופי ומסיימת את הצינור.

10. Java 8 תאריך ושעה API

שאלה 1. ספר לנו על ה- API של תאריך ושעה חדש ב- Java 8

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

השיעורים הקיימים כגון java.util.Date ו SimpleDateFormatter אינם בטוחים בשרשור, מה שמוביל לבעיות פוטנציאליות במקביל למשתמשים.

עיצוב API לקוי הוא גם מציאות ב- API Data Java הישן. הנה רק דוגמה מהירה - שנים אחרי java.util.Date מתחילים בשעה 1900, חודשים מתחילים בשעה 1, והימים מתחילים ב 0 וזה לא מאוד אינטואיטיבי.

גליונות אלה וכמה אחרים הובילו לפופולריות של ספריות תאריכים וזמנים של צד שלישי, כמו Joda-Time.

על מנת לטפל בבעיות אלה ולספק תמיכה טובה יותר ב- JDK, תוכנן ממשק API חדש של תאריך ושעה, שאינו נקי מבעיות אלה, עבור Java SE 8 תחת החבילה. java.time.

11. מסקנה

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

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

בהצלחה בראיון שלך.

הַבָּא » ניהול זיכרון בשאלות ראיון עם Java (+ תשובות) « שאלות ראיון קודמות על מבנה כיתת Java ועל אתחול