ב-Java 8, anyMatch() היא שיטה המוגדרת בממשק Stream. הוא מבצע א פעולת מסוף קצר חשמלי. בחלק זה, נדון ב שיטת anyMatch() ב-Java 8 Stream עם דוגמה. לפני שנעבור לנקודה, ראשית, נבין את פעולות הביניים והטרמינל בפירוט.
בזרם Java 8, פעולות הזרם מחולקות ל ביניים (כמו Stream.filter, Stream.map) ו מָסוֹף (כמו Stream.forEach, Steam.reduce) פעולות. כדי לקבל את התוצאות הרצויות, עלינו לשלב את הפעולות הללו היוצרות צינורות זרמים.
פעולות ביניים
פעולות ביניים הן עצלות (משמעות, לא מבצעת את הפעולה בפועל, במקום להחזיר זרם חדש) בטבע. זה אומר, לשמור על האלמנטים של הזרם הראשוני ותמיד להחזיר זרם חדש של הזרם הראשוני. שימו לב שביצוע הצנרת לא מתחיל עד לביצוע פעולת הטרמינל של הצינור.
פעולות ביניים מחולקות עוד יותר ל חסר מדינה פעולות (כמו מסנן ומפה) ו ממלכתי פעולות (כמו נבדל וממוין).
מבצע חסר מדינה
הפעולות חסרות המצב אינן שומרות על המצב מאלמנטים שנראו בעבר בזמן עיבוד אלמנט חדש. ניתן לעבד כל אלמנט ללא תלות בפעולות על אלמנטים אחרים.
כמה שבועות בחודש
מבצע ממלכתי
הפעולות הממלכתיות שומרות על המדינה מאלמנטים שנראו בעבר תוך עיבוד האלמנטים החדשים. המאפיין של הפעולה הסטטיסטית הוא שהיא מעבדת את כל הקלט לפני הפקת תוצאה.
נניח שאנו מבצעים את פעולת המיון מעל הזרם ורוצים להפיק את התוצאה מאותו זרם מבלי לראות את כל האלמנטים של הזרם, דבר שאינו אפשרי. לכן, עד שלא רואים את כל מרכיבי הנחל, אי אפשר לייצר את התוצאה. לפיכך, עלינו לעבד את כל הקלט לפני הפקת התוצאה.
תפעול מסוף
פעולות מסוף חוצות את הזרם כדי לייצר תוצאה או תופעת לוואי. ברגע שמבוצעת פעולת הטרמינל, צינור הזרם נחשב נצרך. לאחר הצריכה, לא ניתן יותר להשתמש בו. במקרה, אנו דורשים לעבור את אותו מקור נתונים (זרם), החזר את הזרם כדי לקבל זרם חדש.
כמעט כל פעולות הטרמינל הן להוטות באופיים. זה אומר שהם חוצים את הזרם ומעבדים את הצינור לפני שהם חוזרים. שימו לב שזה לא מותר בפעולות דו-טרמינליות כלומר iterator() ו-splitterator().
מלבד הפעולות הנ'ל, ישנה פעולה נוספת המכונה קצר חשמלי מבצע. גם פעולות ביניים וגם פעולות מסוף עלולות לקצר.
א פעולת ביניים מקצר אם יש זרם עם קלט אינסופי. הוא עשוי לייצר זרם סופי כתוצאה מכך.
א תפעול מסוף מקצר אם יש זרם עם קלט אינסופי. זה עשוי להסתיים תוך זמן סופי.
אנו רואים ששימוש בפעולת קצר בצנרת היא חיונית אך אינה מספקת. יש תנאי לעבד זרם אינסופי כלומר להפסיק את הפעולה בדרך כלל בזמן סופי.
Java 8 Stream.anyMatch()
הוא מחזיר אם רכיבים כלשהם בזרם הזה תואמים את הפרדיקט שסופק. ייתכן שהוא לא יעריך את הפרדיקט על כל האלמנטים אם לא נחוץ לקביעת התוצאה.
תחביר:
boolean anyMatch(Predicate predicate)
פרמטרים: זה מקבל א לא מפריע ו חסר מדינה פרידיקט שיש להחיל על אלמנטים של זרם הקלט.
החזרות: זה חוזר נָכוֹן אם אלמנט כלשהו תואם את הפרדיקט שצוין, אחרת מחזירה false. מחזירה false, אם הזרם ריק. במקרה של זרם ריק, הפרדיקט אינו מוערך.
Java anyMatch() לדוגמה
AnyMatchExample1.java
import java.util.stream.Stream; public class AnyMatchExample1 { public static void main(String args[]) { Stream stream = Stream.of('Java', 'Python', 'Hadoop', 'C#', 'C++', 'Kotlin'); boolean match = stream.anyMatch(s -> s.contains('Python')); System.out.println(match); } }
תְפוּקָה:
true
הדוגמה הבאה מתארת זרם ריק שמחזיר תמיד false.
AnyMatchExample2.java
import java.util.Arrays; public class AnyMatchExample2 { public static void main(String args[]) { boolean b = Arrays.asList().stream().anyMatch(e -> true); System.out.println(b); } }
תְפוּקָה:
1 מתוך 1000
false
בוא נראה עוד תוכנית Java שבה ניתחנו מספר פרדיקטים.
כדי לעמוד בתנאים מרובים, צור פרדיקט מורכב עם שתיים או יותר פרדיקטים פשוטים. בדוגמה הנתונה, יש לנו רשימה של עובדים. אנחנו רוצים לבדוק אם יש עובד שגילו הוא 28 והשם מתחיל באלפבית R. תוכנית Java הבאה מתארת את אותו הדבר.
AnyMatchExample.java
import java.util.List; import java.util.function.Predicate; import java.util.ArrayList; class Employee { int empId; int empAge; String empName; //creating a constructor of the Employee class Employee(int id, int age, String name) { this.empId = id; this.empAge = age; this.empName = name; } public int getEmpId() { return empId; } public int getEmpAge() { return empAge; } public String getEmpName() { return empName; } public static List getEmployee() { //instance of the List class List list = new ArrayList(); //adding elements to the List list.add(new Employee(21, 21, 'Andrew')); list.add(new Employee(23, 28, 'Robert')); list.add(new Employee(32, 29, 'Jack')); list.add(new Employee(12, 31, 'Steve')); list.add(new Employee(15, 27, 'Tom')); list.add(new Employee(19, 29, 'Albert')); return list; } } //driver code public class AnyMatchExample { public static void main(String args[]) { //defining predicates Predicate p1 = e -> e.empName.startsWith('S'); Predicate p2 = e -> e.empAge <28 && e.empname.startswith('r'); predicate p3="e" -> e.empName.startsWith('P'); List list = Employee.getEmployee(); //anyMatch() method checks whether any Stream element matches the specified predicate boolean bool1 = list.stream().anyMatch(p1); //prints true if any element of the List starts with the letter s, else prints false System.out.println(bool1); boolean bool2 = list.stream().anyMatch(p2); //prints true if any element of the List starts with the letter z and age is less than 28, else prints false System.out.println(bool2); //anyMatch() method checks whether any Stream element matches the specified predicate boolean bool3 = list.stream().anyMatch(p3); //prints true if any element of the List starts with the letter P, else prints false System.out.println(bool3); } } </28>
תְפוּקָה:
true true false
ממשק ה-Stream מספק שיטה נוספת להתאמת הפרדיקט שצוין, כלומר. allMatch() . ההבדל בין ה-allMatch() ל-anyMatch() הוא ש-anyMatch() מחזיר נָכוֹן אם כל אחד מהרכיבים בזרם תואם את הפרדיקט שצוין. בעת שימוש ב-allMatch(), כל האלמנטים חייבים להתאים לפרדיקט הנתון.
לכן, ניתן להשתמש בשיטת anyMatch() במקרה המסוים כאשר אנו רוצים לבדוק אם יש לפחות אלמנט אחד בזרם. גם המתודה contains() של המחלקה List מבצעת את אותה פעולה. לכן, אנו יכולים להשתמש גם בשיטת contains() במקום שיטת anyMatch() .
לפיכך, אין הבדל בין שיטת List.contains() ל-Stream.anyMatch() .