JavaRush /จาวาบล็อก /Random-TH /คอฟฟี่เบรค #177. คำแนะนำโดยละเอียดเกี่ยวกับ Java Stream ใ...

คอฟฟี่เบรค #177. คำแนะนำโดยละเอียดเกี่ยวกับ Java Stream ใน Java 8

เผยแพร่ในกลุ่ม
ที่มา: Hackernoon โพสต์นี้ให้บทช่วยสอนโดยละเอียดเกี่ยวกับการทำงานกับ Java Stream พร้อมด้วยตัวอย่างโค้ดและคำอธิบาย คอฟฟี่เบรค #177.  คำแนะนำโดยละเอียดเกี่ยวกับ Java Stream ใน Java 8 - 1

รู้เบื้องต้นเกี่ยวกับ Java Threads ใน Java 8

Java Streams ซึ่งเปิดตัวเป็นส่วนหนึ่งของ Java 8 ใช้เพื่อทำงานกับคอลเล็กชันข้อมูล ไม่ใช่โครงสร้างข้อมูลในตัว แต่สามารถใช้เพื่อป้อนข้อมูลจากโครงสร้างข้อมูลอื่นโดยการสั่งซื้อและการวางท่อเพื่อสร้างผลลัพธ์สุดท้าย หมายเหตุ: สิ่งสำคัญคืออย่าสับสนระหว่าง Stream และ Thread เนื่องจากในภาษารัสเซียทั้งสองคำมักถูกอ้างถึงในคำแปลเดียวกันว่า "flow" สตรีมหมายถึงอ็อบเจ็กต์สำหรับการดำเนินการ (ส่วนใหญ่มักจะถ่ายโอนหรือจัดเก็บข้อมูล) ในขณะที่เธรด (การแปลตามตัวอักษร - เธรด) หมายถึงอ็อบเจ็กต์ที่อนุญาตให้โค้ดโปรแกรมบางตัวสามารถดำเนินการควบคู่ไปกับสาขาโค้ดอื่น ๆ เนื่องจากสตรีมไม่ใช่โครงสร้างข้อมูลที่แยกจากกัน จึงไม่เคยเปลี่ยนแหล่งข้อมูล สตรีม Java มีคุณสมบัติดังต่อไปนี้:
  1. Java Stream สามารถใช้งานได้โดยใช้แพ็คเกจ “java.util.stream” สามารถนำเข้าสู่สคริปต์ได้โดยใช้รหัส:

    import java.util.stream.* ;

    การใช้โค้ดนี้ทำให้เราสามารถใช้ฟังก์ชันต่างๆ ในตัวใน Java Stream ได้อย่างง่ายดาย

  2. Java Stream สามารถรับอินพุตจากการรวบรวมข้อมูล เช่น คอลเลกชันและอาร์เรย์ใน Java

  3. Java Stream ไม่จำเป็นต้องเปลี่ยนโครงสร้างข้อมูลอินพุต

  4. Java Stream ไม่เปลี่ยนแหล่งที่มา แต่จะสร้างเอาต์พุตโดยใช้วิธีไปป์ไลน์ที่เหมาะสมแทน

  5. Java Streams ขึ้นอยู่กับการดำเนินการระดับกลางและเทอร์มินัล ซึ่งเราจะกล่าวถึงในหัวข้อต่อไปนี้

  6. ใน Java Stream การดำเนินการระดับกลางจะถูกไปป์ไลน์และเกิดขึ้นในรูปแบบการประเมินแบบ Lazy ปิดท้ายด้วยฟังก์ชันเทอร์มินัล นี่เป็นรูปแบบพื้นฐานสำหรับการใช้ Java Stream

ในส่วนถัดไป เราจะดูวิธีการต่างๆ ที่ใช้ใน Java 8 เพื่อสร้าง Java Stream ตามความจำเป็น

การสร้างสตรีม Java ใน Java 8

เธรด Java สามารถสร้างได้หลายวิธี:

1. การสร้างสตรีมว่างโดยใช้เมธอด Stream.empty()

คุณสามารถสร้างสตรีมว่างเพื่อใช้ในภายหลังในโค้ดของคุณได้ หากคุณใช้ เมธอด Stream.empty()สตรีมว่างจะถูกสร้างขึ้นโดยไม่มีค่าใดๆ สตรีมว่างนี้อาจมีประโยชน์หากเราต้องการข้ามข้อยกเว้นตัวชี้ null ณ รันไทม์ เมื่อต้องการทำเช่นนี้ คุณสามารถใช้คำสั่งต่อไปนี้:
Stream<String> str = Stream.empty();
คำสั่งข้างต้นจะสร้างสตรีมว่างชื่อstrโดยไม่มีองค์ประกอบใดๆ อยู่ข้างใน หากต้องการยืนยันสิ่งนี้ เพียงตรวจสอบจำนวนหรือขนาดของสตรีมโดยใช้คำว่าstr.count( ) ตัวอย่างเช่น,
System.out.println(str.count());
เป็นผลให้ เรา ได้รับ 0 ที่เอาต์พุต

2. สร้างสตรีมโดยใช้เมธอด Stream.builder() ด้วยอินสแตนซ์ Stream.Builder

นอกจากนี้เรายังสามารถใช้Stream Builderเพื่อสร้างสตรีมโดยใช้รูปแบบการออกแบบของ Builder มันถูกออกแบบมาสำหรับการก่อสร้างวัตถุทีละขั้นตอน มาดูกันว่าเราจะสร้างอินสแตนซ์ของสตรีมโดยใช้Stream Builderได้ อย่างไร
Stream.Builder<Integer> numBuilder = Stream.builder();

numBuilder.add(1).add(2).add( 3);

Stream<Integer> numStream = numBuilder.build();
เมื่อใช้โค้ดนี้ คุณสามารถสร้างสตรีมชื่อnumStreamที่มี องค์ประกอบ intได้ ทุกอย่างเสร็จเร็วมากด้วย อินสแตนซ์ Stream.Builderชื่อnumBuilderที่สร้างขึ้นก่อน

3. สร้างสตรีมด้วยค่าที่ระบุโดยใช้วิธี Stream.of()

อีกวิธีหนึ่งใน การสร้างสตรีมเกี่ยวข้องกับการใช้เมธอดStream.of() นี่เป็นวิธีง่ายๆ ในการสร้างสตรีมด้วยค่าที่กำหนด มันประกาศและเตรียมใช้งานเธรดด้วย ตัวอย่างการใช้ Stream.of()วิธีการสร้างกระแส:
Stream<Integer> numStream = Stream.of(1, 2, 3);
โค้ดนี้จะสร้างสตรีมที่มี องค์ประกอบ intเช่นเดียวกับที่เราทำในวิธีก่อนหน้าโดยใช้Stream.Builder ที่นี่เราได้สร้างสตรีมโดยตรงโดยใช้Stream.of()ด้วยค่าที่กำหนดไว้ล่วงหน้า[1, 2 และ 3 ]

4. สร้างสตรีมจากอาร์เรย์ที่มีอยู่โดยใช้เมธอด Arrays.stream()

อีกวิธีทั่วไปในการสร้างเธรดเกี่ยวข้องกับการใช้อาร์เรย์ใน Java สตรีมที่ นี่ถูกสร้างขึ้นจากอาร์เรย์ที่มีอยู่โดยใช้ เมธอด Arrays.stream() องค์ประกอบอาร์เรย์ทั้งหมดจะถูกแปลงเป็นองค์ประกอบสตรีม นี่เป็นตัวอย่างที่ดี:
Integer[] arr = {1, 2, 3, 4, 5};

Stream<Integer> numStream = Arrays.stream(arr);
โค้ดนี้จะสร้างnumStreamที่มีเนื้อหาของอาร์เรย์ที่เรียกว่า arr ซึ่งเป็นอาร์เรย์จำนวนเต็ม

5. การรวมสองสตรีมที่มีอยู่โดยใช้วิธี Stream.concat()

อีกวิธีหนึ่งที่สามารถใช้ในการสร้างสตรีมได้คือวิธีStream.concat() ใช้เพื่อรวมสองเธรดเพื่อสร้างเธรดเดียว กระแสทั้งสองรวมกันตามลำดับ ซึ่งหมายความว่าเธรดแรกมาก่อน ตามด้วยเธรดที่สอง และต่อๆ ไป ตัวอย่างของการต่อข้อมูลดังกล่าวมีลักษณะดังนี้:
Stream<Integer> numStream1 = Stream.of(1, 2, 3, 4, 5);

Stream<Integer> numStream2 = Stream.of(1, 2, 3);

Stream<Integer> combinedStream = Stream.concat( numStream1, numStream2);
ข้อความข้างต้นจะสร้างสตรีมสุดท้ายชื่อintegratedStreamซึ่งมีองค์ประกอบของสตรีมแรกnumStream1และสตรีมที่สองnumStream2 ทีละ รายการ

ประเภทของการดำเนินการกับ Java Stream

ดังที่ได้กล่าวไปแล้ว คุณสามารถดำเนินการได้สองประเภทด้วย Java Stream ใน Java 8: ระดับกลางและเทอร์มินัล มาดูรายละเอียดเพิ่มเติมกัน

การดำเนินงานระดับกลาง

การดำเนินการระดับกลางจะสร้างกระแสเอาต์พุตและดำเนินการเฉพาะเมื่อพบกับการทำงานของเทอร์มินัลเท่านั้น ซึ่งหมายความว่าการดำเนินการขั้นกลางจะถูกดำเนินการอย่างเกียจคร้าน ดำเนินการไปป์ไลน์ และสามารถทำได้โดยการดำเนินการเทอร์มินัลเท่านั้น คุณจะได้เรียนรู้เกี่ยวกับการประเมินแบบขี้เกียจและการวางท่อในภายหลัง ตัวอย่างของการดำเนินการระดับกลางมีวิธีการดังต่อไปนี้: filter() , map() , different() , peek() , sorted()และอื่นๆ

การดำเนินงานเทอร์มินัล

การดำเนินการเทอร์มินัลทำให้การดำเนินการขั้นกลางเสร็จสิ้น และยังส่งคืนผลลัพธ์สุดท้ายของสตรีมเอาท์พุตอีกด้วย เนื่องจากการดำเนินการของเทอร์มินัลส่งสัญญาณการสิ้นสุดของการดำเนินการแบบ Lazy และการวางท่อ เธรดนี้ไม่สามารถใช้งานได้อีกครั้งหลังจากผ่านการดำเนินการของเทอร์มินัลแล้ว ตัวอย่างของการดำเนินการเทอร์มินัลมีวิธีการดังต่อไปนี้: forEach() , collect() , count() , ลด()และอื่นๆ

ตัวอย่างการดำเนินการกับ Java Stream

การดำเนินงานระดับกลาง

ต่อไปนี้เป็นตัวอย่างของการดำเนินการระดับกลางบางอย่างที่สามารถนำไปใช้กับ Java Stream ได้:

กรอง()

วิธีการนี้ใช้ในการกรององค์ประกอบจากสตรีมที่ตรงกับภาคแสดงเฉพาะใน Java รายการที่กรองเหล่านี้จะสร้างสตรีมใหม่ เรามาดูตัวอย่างเพื่อทำความเข้าใจกันดีกว่า
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); List<Integer> even = numStream.filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(even);
บทสรุป:
[98]
คำอธิบาย: ในตัวอย่างนี้ คุณจะเห็นว่าองค์ประกอบคู่ (หารด้วย 2) จะถูกกรองโดยใช้เมธอดfilter()และจัดเก็บไว้ในรายการจำนวนเต็มnumStreamซึ่งเนื้อหาจะถูกพิมพ์ในภายหลัง เนื่องจาก 98 เป็นจำนวนเต็มเลขคู่เพียงตัวเดียวในสตรีม จึงถูกพิมพ์ในเอาต์พุต

แผนที่()

วิธีการนี้ใช้เพื่อสร้างสตรีมใหม่โดยเรียกใช้ฟังก์ชันที่แมปบนองค์ประกอบของสตรีมอินพุตดั้งเดิม บางทีสตรีมใหม่อาจมีประเภทข้อมูลที่แตกต่างออกไป ตัวอย่างมีลักษณะดังนี้:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); List<Integer> d = numStream.map(n -> n*2) .collect(Collectors.toList()); System.out.println(d);
บทสรุป:
[86, 130, 2, 196, 126]
คำอธิบาย: ที่นี่เรา จะ เห็นว่า เมธอด map()ถูกใช้เพื่อเพิ่มแต่ละองค์ประกอบของ สตรีม numStream เป็นสองเท่า ดังที่คุณเห็นจากเอาต์พุต แต่ละองค์ประกอบในสตรีมได้รับการเพิ่มเป็นสองเท่าเรียบร้อยแล้ว

แตกต่าง()

วิธีการนี้ใช้เพื่อดึงข้อมูลเฉพาะองค์ประกอบแต่ละรายการในสตรีมโดยการกรองรายการที่ซ้ำกันออก ตัวอย่างเดียวกันนี้มีลักษณะดังนี้:
Stream<Integer> numStream = Stream.of(43,65,1,98,63,63,1); List<Integer> numList = numStream.distinct() .collect(Collectors.toList()); System.out.println(numList);
บทสรุป:
[43, 65, 1, 98, 63]
คำอธิบาย: ในกรณีนี้จะใช้เมธอดdifferent () สำหรับ numStream จะดึงข้อมูลแต่ละองค์ประกอบทั้งหมดใน numList โดยลบรายการที่ซ้ำกันออกจากสตรีม ดังที่คุณเห็นจากเอาต์พุต ไม่มีรายการที่ซ้ำกัน ต่างจากสตรีมอินพุตซึ่งในตอนแรกมีสองรายการที่ซ้ำกัน (63 และ 1)

แอบมอง()

วิธีการนี้ใช้เพื่อติดตามการเปลี่ยนแปลงระหว่างกลางก่อนดำเนินการการดำเนินการเทอร์มินัล ซึ่งหมายความว่าpeek()สามารถใช้ดำเนินการกับแต่ละองค์ประกอบของสตรีมเพื่อสร้างสตรีมที่สามารถดำเนินการระดับกลางเพิ่มเติมได้
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); List<Integer> nList = numStream.map(n -> n*10) .peek(n->System.out.println("Mapped: "+ n)) .collect(Collectors.toList()); System.out.println(nList);
บทสรุป:
แมปแล้ว: 430 แมปแล้ว: 650 แมปแล้ว: 10 แมปแล้ว: 980 แมปแล้ว: 630 [430, 650, 10, 980, 630]
คำอธิบาย: ที่นี่ใช้ เมธอด peek() เพื่อสร้างผลลัพธ์ระดับกลาง เนื่องจาก เมธอด map()ถูกนำไปใช้กับองค์ประกอบของสตรีม ที่นี่เราจะสังเกตได้ว่าก่อนที่จะใช้ การดำเนินการเทอร์มินัล collect()เพื่อพิมพ์เนื้อหาสุดท้ายของรายการใน คำสั่ง printผลลัพธ์สำหรับการแมปองค์ประกอบสตรีมแต่ละรายการจะถูกพิมพ์ตามลำดับล่วงหน้า

เรียงลำดับ()

sorted()วิธีการที่ใช้ในการเรียงลำดับองค์ประกอบของกระแส ตามค่าเริ่มต้น จะเรียงลำดับองค์ประกอบจากน้อยไปหามาก คุณยังสามารถระบุลำดับการจัดเรียงเฉพาะเป็นพารามิเตอร์ได้ ตัวอย่างการใช้งานวิธีนี้มีลักษณะดังนี้:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); numStream.sorted().forEach(n -> System.out.println(n));
บทสรุป:
1 43 ​​​​63 65 98
คำอธิบาย: ในที่นี้ วิธีการ sorted()ใช้เพื่อจัดเรียงองค์ประกอบของสตรีมจากน้อยไปมากตามค่าเริ่มต้น (เนื่องจากไม่ได้ระบุลำดับเฉพาะ) คุณจะเห็นว่ารายการที่พิมพ์ในเอาต์พุตนั้นจัดเรียงจากน้อยไปหามาก

การดำเนินงานเทอร์มินัล

ต่อไปนี้เป็นตัวอย่างการทำงานของเทอร์มินัลบางอย่างที่สามารถนำไปใช้กับสตรีม Java ได้:

แต่ละ()

เมธอดforEach()ใช้เพื่อวนซ้ำองค์ประกอบทั้งหมดของสตรีมและดำเนินการฟังก์ชันกับแต่ละองค์ประกอบทีละรายการ สิ่งนี้ทำหน้าที่เป็นทางเลือกแทนคำสั่งวนซ้ำ เช่นfor , whileและอื่นๆ ตัวอย่าง:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); numStream.forEach(n -> System.out.println(n));
บทสรุป:
43 65 1 98 63
คำอธิบาย: ที่นี่ใช้ เมธอด forEach() เพื่อพิมพ์แต่ละองค์ประกอบของสตรีมทีละรายการ

นับ()

วิธีการนับ ()ใช้เพื่อดึงข้อมูลจำนวนองค์ประกอบทั้งหมดที่มีอยู่ในสตรีม คล้ายกับ เมธอด size()ซึ่งมักใช้เพื่อกำหนดจำนวนองค์ประกอบทั้งหมดในคอลเลกชัน ตัวอย่างการใช้ count()วิธีการกับ Java Stream เป็นดังนี้:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); System.out.println(numStream.count());
บทสรุป:
5
คำอธิบาย: เนื่องจากnumStreamมีองค์ประกอบจำนวนเต็ม 5 องค์ประกอบ การใช้ เมธอด count()จะทำให้เอาต์พุตเป็น 5

เก็บรวบรวม()

วิธีการ collect()ใช้ในการลดองค์ประกอบสตรีมที่ไม่แน่นอน สามารถใช้เพื่อลบเนื้อหาออกจากสตรีมหลังจากการประมวลผลเสร็จสิ้น ใช้คลาส Collectorเพื่อดำเนินการลดขนาด
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); List<Integer> odd = numStream.filter(n -> n % 2 == 1) .collect(Collectors.toList()); System.out.println(odd);
บทสรุป:
[43, 65, 1, 63]
คำอธิบาย: ในตัวอย่างนี้ องค์ประกอบคี่ทั้งหมดในสตรีมจะถูกกรองและรวบรวม/ลดลงในรายการชื่อคี่ ในตอนท้ายรายการคี่จะถูกพิมพ์ออกมา

นาที()และสูงสุด()

เมธอดmin()ดังที่ชื่อแนะนำ สามารถใช้กับสตรีมเพื่อค้นหาองค์ประกอบขั้นต่ำในสตรีมได้ ในทำนองเดียวกันสามารถใช้ วิธี max() เพื่อค้นหาองค์ประกอบสูงสุดในสตรีมได้ ลองทำความเข้าใจว่าสามารถนำมาใช้กับตัวอย่างได้อย่างไร:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); int smallest = numStream.min((m, n) -> Integer.compare(m, n)).get(); System.out.println("Smallest element: " + smallest);
numStream = Stream.of(43, 65, 1, 98, 63); int largest = numStream.max((m, n) -> Integer.compare(m, n)).get(); System.out.println("Largest element: " + largest);
บทสรุป:
องค์ประกอบที่เล็กที่สุด: 1 องค์ประกอบที่ใหญ่ที่สุด: 98
คำอธิบาย: ในตัวอย่างนี้ เราพิมพ์องค์ประกอบที่เล็กที่สุดใน numStream โดยใช้วิธีmin()และองค์ประกอบที่ใหญ่ที่สุดโดยใช้วิธีmax() โปรดทราบว่าก่อนที่จะใช้เมธอดmax()เราได้เพิ่มองค์ประกอบในnumStream อีกครั้ง เนื่องจากmin()เป็นการดำเนินการเทอร์มินัลและทำลายเนื้อหาของสตรีมต้นฉบับ โดยส่งคืนเฉพาะผลลัพธ์สุดท้าย (ซึ่งในกรณีนี้คือจำนวนเต็ม "น้อยที่สุด")

findAny()และfindFirst()

findAny()ส่งคืนองค์ประกอบใด ๆ ของสตรีมเป็นตัวเลือก หากสตรีมว่างเปล่า ก็จะส่งคืน ค่า Optionalซึ่งจะว่างเปล่า ด้วย findFirst()ส่งคืนองค์ประกอบแรกของสตรีมเป็นตัวเลือก เช่นเดียวกับเมธอดfindAny() เมธอด findFirst()จะส่งกลับ พารามิเตอร์ ทางเลือก ที่ว่างเปล่า เช่นกัน หากสตรีมที่เกี่ยวข้องนั้นว่างเปล่า ลองมาดูตัวอย่างต่อไปนี้ตามวิธีการเหล่านี้:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); Optional<Integer> opt = numStream.findFirst();System.out.println(opt); numStream = Stream.empty(); opt = numStream.findAny();System.out.println(opt);
บทสรุป:
ไม่บังคับ[43] ไม่บังคับ.ว่าง
คำอธิบาย: ในกรณีแรกนี้เมธอดfindFirst()จะส่งคืนองค์ประกอบแรกของสตรีมเป็นOptional จากนั้น เมื่อเธรดถูกกำหนดใหม่เป็นเธรดว่าง เมธอดfindAny ()จะส่งคืนค่าว่างOptional

allMatch() , anyMatch()และnoneMatch()

เมธอดallMatch()ใช้เพื่อตรวจสอบว่าองค์ประกอบทั้งหมดในสตรีมตรงกับเพรดิเคตบางรายการหรือไม่ และส่งกลับค่าบูลีนจริงหากเป็นเช่นนั้น มิฉะนั้นจะส่งคืนค่าfalse หากสตรีมว่างเปล่า จะส่งคืนค่าtrue เมธอดanyMatch()ใช้เพื่อตรวจสอบว่าองค์ประกอบใดในสตรีมตรงกับภาคแสดงที่กำหนดหรือไม่ มันจะคืนค่าเป็นจริงหากเป็นเช่นนั้นมิฉะนั้นจะเป็นเท็จ หากสตรีมว่างเปล่า ก็จะส่งกลับfalse เมธอดnoneMatch()จะคืนค่าเป็นจริงหากไม่มีองค์ประกอบใดในสตรีมที่ตรงกับภาคแสดง มิฉะนั้นจะคืนค่าเป็นเท็จ ตัวอย่างที่แสดงให้เห็นสิ่งนี้มีลักษณะดังนี้:
Stream<Integer> numStream = Stream.of(43, 65, 1, 98, 63); boolean flag = numStream.allMatch(n -> n1); System.out.println(flag); numStream = Stream.of(43, 65, 1, 98, 63); flag = numStream.anyMatch(n -> n1); System.out.println(flag); numStream = Stream.of(43, 65, 1, 98, 63); flag = numStream.noneMatch(n -> n==1);System.out.println(flag);
บทสรุป:
เท็จจริงเท็จ
คำอธิบาย: สำหรับสตรีมnumStreamที่มี 1 เป็นองค์ประกอบ วิธีการ allMatch()จะส่งกลับค่าเท็จเนื่องจากองค์ประกอบทั้งหมดไม่ใช่ 1 แต่มีเพียงองค์ประกอบเดียวเท่านั้นที่เป็น เมธอดanyMatch()ส่งคืนค่าจริงเนื่องจากมีองค์ประกอบอย่างน้อยหนึ่งรายการคือ 1 เมธอด noneMatch()ส่งคืนค่าเท็จเนื่องจากมี 1 อยู่จริงเป็นองค์ประกอบในสตรีมนี้

การประเมิน Lazy ใน Java Stream

การประเมินแบบ Lazy นำไปสู่การเพิ่มประสิทธิภาพเมื่อทำงานกับ Java Streams ใน Java 8 โดยส่วนใหญ่เกี่ยวข้องกับการชะลอการดำเนินการระดับกลางจนกว่าจะพบการทำงานของเทอร์มินัล การประเมินแบบ Lazy มีหน้าที่ป้องกันการสิ้นเปลืองทรัพยากรโดยไม่จำเป็นในการคำนวณจนกว่าจะต้องการผลลัพธ์จริง สตรีมเอาต์พุตที่เป็นผลจากการดำเนินการขั้นกลางจะถูกสร้างขึ้นหลังจากการดำเนินการเทอร์มินัลเสร็จสิ้นแล้วเท่านั้น การประเมิน Lazy ทำงานร่วมกับการดำเนินการระดับกลางทั้งหมดในสตรีม Java การใช้การประเมินแบบสันหลังยาวที่มีประโยชน์มากเกิดขึ้นเมื่อทำงานกับสตรีมที่ไม่มีที่สิ้นสุด วิธีนี้ช่วยป้องกันการประมวลผลที่ไม่จำเป็นจำนวนมาก

ไปป์ไลน์ใน Java Stream

ไปป์ไลน์ใน Java Stream ประกอบด้วยอินพุตสตรีม การดำเนินการระดับกลางเป็นศูนย์หรือมากกว่านั้นเรียงกันทีละรายการ และสุดท้ายคือการดำเนินการเทอร์มินัล การดำเนินการระดับกลางใน Java Streams ดำเนินการอย่างเกียจคร้าน สิ่งนี้ทำให้การดำเนินการขั้นกลางแบบไปป์ไลน์เป็นสิ่งที่หลีกเลี่ยงไม่ได้ ด้วยไปป์ไลน์ซึ่งโดยพื้นฐานแล้วเป็นการดำเนินการระดับกลางที่รวมกันตามลำดับ การดำเนินการแบบ Lazy จึงเป็นไปได้ ไปป์ไลน์ช่วยติดตามการดำเนินงานขั้นกลางที่ต้องดำเนินการหลังจากพบการทำงานของเทอร์มินัลในที่สุด

บทสรุป

ให้เราสรุปสิ่งที่เราได้เรียนรู้ในวันนี้ ในบทความนี้:
  1. เรามาดูกันคร่าวๆ ว่า Java Streams คืออะไร
  2. จากนั้นเราได้เรียนรู้เทคนิคต่างๆ มากมายสำหรับการสร้างเธรด Java ใน Java 8
  3. เราเรียนรู้การดำเนินงานหลักสองประเภท (การดำเนินงานระดับกลางและการดำเนินงานเทอร์มินัล) ที่สามารถทำได้บนสตรีม Java
  4. จากนั้นเราดูรายละเอียดหลายตัวอย่างของการดำเนินการทั้งระดับกลางและเทอร์มินัล
  5. เราได้เรียนรู้เพิ่มเติมเกี่ยวกับการประเมินแบบ Lazy Evasion และสุดท้ายก็เรียนรู้เกี่ยวกับ Pipelining ใน Java Threads
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION