מציאת אלמנטים באוספים בגרובי

1. הקדמה

Groovy מספק מספר רב של שיטות המשפרות את יכולות הליבה של Java.

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

2. בדוק אם אלמנט קיים

ראשית, נתמקד רק בבדיקה אם אוסף נתון מכיל אלמנט.

2.1. רשימה

ג'אווה עצמה מספקת מספר דרכים חיפוש פריט ברשימה עם java.util.List:

  • ה מכיל שיטה
  • ה אינדקס של שיטה

מכיוון ש- Groovy היא שפה התואמת ל- Java, אנו יכולים להשתמש בה בבטחה.

בואו נסתכל על דוגמה:

@Test בטל כאשר ListContainsElement_thenCheckReturnsTrue () {def list = ['a', 'b', 'c'] assertTrue (list.indexOf ('a')> -1) assertTrue (list.contains ('a'))}

חוץ מזה, גרובי מציג את מפעיל החברות:

אלמנט ברשימה

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

@Test בטל כאשר ListContainsElement_thenCheckWithMembershipOperatorReturnsTrue () {def list = ['a', 'b', 'c'] assertTrue ('a' ברשימה)}

2.2. מַעֲרֶכֶת

כמו בדוגמה הקודמת, אנו יכולים להשתמש ב- java.util.Set # מכיל שיטה ו ב מַפעִיל:

@Test בטל כאשר SetContainsElement_thenCheckReturnsTrue () {def set = ['a', 'b', 'c'] כמו Set assertTrue (set.contains ('a')) assertTrue ('a' בערכה)}

2.3. מַפָּה

במקרה של א מַפָּה, אנו יכולים לבדוק אם המפתח או הערך ישירות:

@Test בטל כאשר MapContainsKeyElement_thenCheckReturnsTrue () {def map = [a: 'd', b: 'e', ​​c: 'f'] assertTrue (map.containsKey ('a')) assertFalse (map.containsKey ('e') ) assertTrue (map.containsValue ('e'))}

או השתמש במפעיל החברות כדי למצוא את המפתח התואם:

@Test בטל כאשר MapContainsKeyElement_thenCheckByMembershipReturnsTrue () {def map = [a: 'd', b: 'e', ​​c: 'f'] assertTrue ('a' במפה) assertFalse ('f' במפה)}

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

@Test בטל כאשר MapContainsFalseBooleanValues_thenCheckReturnsFalse () {def map = [a: true, b: false, c: null] assertTrue (map.containsKey ('b')) assertTrue ('a' במפה) assertFalse ('b' במפה) assertFalse ('c' במפה)}

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

3. כל המשחקים וכל משחקים

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

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

כיתת אדם {פרטי שם פרטי מחרוזת פרטי שם משפחה מחרוזת פרטי גיל שלם // בונה, גטרים וקובעים}

3.1. רשימה / סט

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

person final listList = [אדם חדש ("רג'ינה", "פיצפטריק", 25), אדם חדש ("אבגיל", "באלארד", 26), אדם חדש ("לוסיאן", "וולטר", 30),]

כפי שהזכרנו קודם, Groovy היא שפה תואמת Javaאז בואו ניצור תחילה דוגמה באמצעות ה- זרם ממשק API שהוצג על ידי Java 8:

@Test בטל givenListOfPerson_whenUsingStreamMatching_thenShouldEvaluateList () {assertTrue (personList.stream (). AnyMatch {it.age> 20}) assertFalse (personList.stream (). AllMatch {it.age <30})}

אנו יכולים גם להשתמש בשיטות גרובי DefaultGroovyMethods # any ו DefaultGroovyMethods # כל שמבצעים את הבדיקה ישירות באוסף:

@Test void givenListOfPerson_whenUsingCollectionMatching_thenShouldEvaluateList () {assertTrue (personList.any {it.age> 20}) assertFalse (personList.every {it.age <30})}

3.2. מַפָּה

נתחיל בהגדרת א מַפָּה שֶׁל אדם חפצים ממופים על ידי שם פרטי של אדם מספר:

person final personMap = [Regina: Person new ("Regina", "Fitzpatrick", 25), Abagail: Person new ("Abagail", "Ballard", 26), Lucian: Person new ("Lucian", "Walter", 30)]

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

@Test בטל givenMapOfPerson_whenUsingStreamMatching_thenShouldEvaluateMap () {assertTrue (personMap.keySet (). Stream (). AnyMatch {it == "Regina"}) assertFalse (personMap.keySet (). Stream (). AllMatch {it == "Albert ) assertFalse (personMap.values ​​(). stream (). allMatch {it.age <30}) assertTrue (personMap.entrySet (). stream (). anyMatch {it.key == "Abagail" && it.value.lastname == "Ballard"})}

ואז, ממשק ה- API של Groovy Collection:

@Test בטל givenMapOfPerson_whenUsingCollectionMatching_thenShouldEvaluateMap () {assertTrue (personMap.keySet (). כל {it == "Regina"}) assertFalse (personMap.keySet (). כל {it == "Albert"}) assertFalse (personM) . כל שם פרטי {it.age == "Abagail" && person.lastname == "Ballard"})}

כפי שאנו רואים, גרובי לא רק מחליף כראוי את זרם ממשק API בעת מניפולציות במפות אך גם מאפשר לנו לבצע בדיקה ישירות ב- מַפָּה אובייקט במקום להשתמש ב- java.util.Map # entrySet שיטה.

4. מצא אלמנט אחד או יותר באוסף

4.1. רשימה / סט

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

@Test בטל givenListOfPerson_whenUsingStreamFind_thenShouldReturnMatchingElements () {assertTrue (personList.stream (). מסנן {it.age> 20} .findAny (). IsPresent ()) assertFalse (personList.stream (). מסנן {it.age> 30}. () .isPresent ()) assertTrue (personList.stream (). filter {it.age> 20} .findAll (). size () == 3) assertTrue (personList.stream (). filter {it.age> 30 } .findAll (). isEmpty ())}

כפי שאנו רואים, הדוגמה לעיל משתמשת java.util. אופציונלי למציאת אלמנט יחיד כ- זרם API מאלץ גישה זו.

מצד שני, גרובי מציעה תחביר קומפקטי בהרבה:

@Test בטל givenListOfPerson_whenUsingCollectionFind_thenShouldReturnMatchingElements () {assertNotNull (personList.find {it.age> 20}) assertNull (personList.find {it.age> 30}) assertTrue (personList.findAll {it.age> 20}. = 3) assertTrue (personList.findAll {it.age> 30} .isEmpty ())}

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

4.2. מַפָּה

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

בואו נעשה שימוש חוזר שלנו personMap מקודם:

@Test בטל givenMapOfPerson_whenUsingStreamFind_thenShouldReturnElements () {assertTrue (personMap.entrySet (). Stream () .filter {it.key == "Abagail" && it.value.lastname == "Ballard"} .findAny ().) נוכח assertTrue (personMap.entrySet (). stream () .filter {it.value.age> 20} .findAll (). size () == 3)}

ושוב, הפיתרון הגרובי הפשוט:

@Test בטל givenMapOfPerson_whenUsingCollectionFind_thenShouldReturnElements () {assertNotNull (personMap.find {it.key == "Abagail" && it.value.lastname == "Ballard"}) assertTrue (personMap.findAll {it.value.age> 20> () == 3)}

במקרה זה, היתרונות משמעותיים עוד יותר. אנו מדלגים על java.util.Map # entrySet שיטה ולהשתמש בסגירה עם פונקציה המסופקת על מַפָּה.

5. מסקנה

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

כמו תמיד, דוגמאות הקוד המלאות המשמשות במדריך זה זמינות באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found