מיזוג זרמים בג'אווה

1. סקירה כללית

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

2. שימוש ב- Java רגיל

JDK 8 זרם בכיתה יש כמה שיטות שימוש סטטיות שימושיות. בואו נסתכל מקרוב על ה- concat () שיטה.

2.1. מיזוג שניים זרמים

הדרך הפשוטה ביותר לשלב 2 זרםs הוא להשתמש בסטטי Stream.concat () שיטה:

@Test הציבור בטל כאשרMergingStreams_thenResultStreamContainsElementsFromBoth () {Stream stream1 = Stream.of (1, 3, 5); זרם stream2 = Stream.of (2, 4, 6); זרם resultStream = Stream.concat (stream1, stream2); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6), וכתוצאה מכך Stream.collect (Collectors.toList ())); } 

2.2. מיזוג מרובה זרםס

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

קטע הקוד הבא מראה זאת בפעולה:

@Test הציבור בטל given3Streams_whenMerged_thenResultStreamContainsAllElements () {Stream stream1 = Stream.of (1, 3, 5); זרם stream2 = Stream.of (2, 4, 6); זרם stream3 = Stream.of (18, 15, 36); זרם resultStream = Stream.concat (Stream.concat (stream1, stream2), stream3); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6, 18, 15, 36), וכתוצאה מכך Stream.collect (Collectors.toList ())); } 

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

@Test ציבורי בטל given4Streams_whenMerged_thenResultStreamContainsAllElements () {Stream stream1 = Stream.of (1, 3, 5); זרם stream2 = Stream.of (2, 4, 6); זרם stream3 = Stream.of (18, 15, 36); זרם stream4 = Stream.of (99); זרם resultStream = Stream.of (stream1, stream2, stream3, stream4) .flatMap (i -> i); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6, 18, 15, 36, 99), וכתוצאה מכך Stream.collect (Collectors.toList ())); } 

מה שקורה כאן הוא:

  • ראשית אנו יוצרים חדש זרם המכיל את 4 זרמים, מה שמביא לא זרם
  • אז אנחנו flatMap () זה לתוך א זרם באמצעות פונקציית הזהות

3. שימוש ב- StreamEx

StreamEx היא ספריית Java עם קוד פתוח המרחיבה את האפשרויות של זרמי Java 8. הוא משתמש ב- StreamEx בכיתה כשיפור ל- JDK זרם מִמְשָׁק.

3.1. מיזוג זרםס

ספריית StreamEx מאפשרת לנו למזג זרמים באמצעות ה- לְצַרֵף() שיטת מופע:

@Test הציבור בטל given4Streams_whenMerged_thenResultStreamContainsAllElements () {Stream stream1 = Stream.of (1, 3, 5); זרם stream2 = Stream.of (2, 4, 6); זרם stream3 = Stream.of (18, 15, 36); זרם stream4 = Stream.of (99); זרם וכתוצאה מכך Stream = StreamEx.of (stream1) .append (stream2) .append (stream3) .append (stream4); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6, 18, 15, 36, 99), וכתוצאה מכך Stream.collect (Collectors.toList ())); } 

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

שים לב שנוכל ליצור גם רשימה מחוץ לזרם באמצעות למנות() אם אנו מקלידים את וכתוצאה מכך זרם משתנה ל StreamEx סוּג.

3.2. מיזוג זרמים באמצעות לתלות ()

StreamEx מכיל גם שיטה שמוסיפה אלמנטים אחד לפני השני לתלות ():

@ מבחן הריק פומבי נתון3Streams_whenPrepended_thenResultStreamContainsAllElements () {Stream stream1 = Stream.of ("foo", "bar"); זרם openingBracketStream = Stream.of ("["); זרם closedBracketStream = Stream.of ("]"); זרם resultStream = StreamEx.of (stream1) .append (סוגרBracketStream) .prepend (openingBracketStream); assertEquals (Arrays.asList ("[", "foo", "bar", "]"), וכתוצאה מכך Stream.collect (Collectors.toList ())); } 

4. שימוש ב- Jooλ

jOOλ היא ספרייה תואמת JDK 8 המספקת הרחבות שימושיות ל- JDK. הפשטת הזרם החשובה ביותר כאן נקראת רצף. שים לב שמדובר בזרם רציף ומסודר, אז קורא מַקְבִּיל() לא תהיה השפעה.

4.1. מיזוג זרמים

בדיוק כמו ספריית StreamEx, ל- jOOλ יש לְצַרֵף() שיטה:

@Test הציבור בטל given2Streams_whenMerged_thenResultStreamContainsAllElements () {זרם seq1 = Stream.of (1, 3, 5); זרם seq2 = Stream.of (2, 4, 6); זרם resultSeq = Seq.ofType (seq1, Integer.class) .append (seq2); assertEquals (Arrays.asList (1, 3, 5, 2, 4, 6), resultSeq.collect (Collectors.toList ())); } 

כמו כן, יש נוחות למנות() אם אנו מקלידים את וכתוצאה מכך משתנה ל- jOOλ רצף סוּג.

4.2. מיזוג זרמים עם לתלות מראש ()

כצפוי, מאז לְצַרֵף() שיטה קיימת, יש גם א לתלות מראש () שיטה ב- jOOλ:

@ מבחן חלל ציבורי given3Streams_whenPrepending_thenResultStreamContainsAllElements () {Stream seq = Stream.of ("foo", "bar"); זרם openingBracketSeq = Stream.of ("["); זרם closedBracketSeq = Stream.of ("]"); זרם resultStream = Seq.ofType (seq, String.class) .append (סגירת BracketSeq). Prepend (openingBracketSeq); Assert.assertEquals (Arrays.asList ("[", "foo", "bar", "]"), וכתוצאה מכך Stream.collect (Collectors.toList ())); } 

5. מסקנה

ראינו כי מיזוג זרמים פשוט יחסית באמצעות JDK 8. כשאנחנו צריכים לעשות הרבה מיזוג, זה עשוי להיות מועיל להשתמש בספריית StreamEx או jOOλ למען הקריאה.

אתה יכול למצוא את קוד המקור ב- GitHub.


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