ที่มา: Hackernoon โพสต์นี้ให้บทช่วยสอนโดยละเอียดเกี่ยวกับการทำงานกับ Java Stream พร้อมด้วยตัวอย่างโค้ดและคำอธิบาย
รู้เบื้องต้นเกี่ยวกับ Java Threads ใน Java 8
Java Streams ซึ่งเปิดตัวเป็นส่วนหนึ่งของ Java 8 ใช้เพื่อทำงานกับคอลเล็กชันข้อมูล ไม่ใช่โครงสร้างข้อมูลในตัว แต่สามารถใช้เพื่อป้อนข้อมูลจากโครงสร้างข้อมูลอื่นโดยการสั่งซื้อและการวางท่อเพื่อสร้างผลลัพธ์สุดท้าย หมายเหตุ: สิ่งสำคัญคืออย่าสับสนระหว่าง Stream และ Thread เนื่องจากในภาษารัสเซียทั้งสองคำมักถูกอ้างถึงในคำแปลเดียวกันว่า "flow" สตรีมหมายถึงอ็อบเจ็กต์สำหรับการดำเนินการ (ส่วนใหญ่มักจะถ่ายโอนหรือจัดเก็บข้อมูล) ในขณะที่เธรด (การแปลตามตัวอักษร - เธรด) หมายถึงอ็อบเจ็กต์ที่อนุญาตให้โค้ดโปรแกรมบางตัวสามารถดำเนินการควบคู่ไปกับสาขาโค้ดอื่น ๆ เนื่องจากสตรีมไม่ใช่โครงสร้างข้อมูลที่แยกจากกัน จึงไม่เคยเปลี่ยนแหล่งข้อมูล สตรีม Java มีคุณสมบัติดังต่อไปนี้:-
Java Stream สามารถใช้งานได้โดยใช้แพ็คเกจ “java.util.stream” สามารถนำเข้าสู่สคริปต์ได้โดยใช้รหัส:
import java.util.stream.* ;
การใช้โค้ดนี้ทำให้เราสามารถใช้ฟังก์ชันต่างๆ ในตัวใน Java Stream ได้อย่างง่ายดาย
-
Java Stream สามารถรับอินพุตจากการรวบรวมข้อมูล เช่น คอลเลกชันและอาร์เรย์ใน Java
-
Java Stream ไม่จำเป็นต้องเปลี่ยนโครงสร้างข้อมูลอินพุต
-
Java Stream ไม่เปลี่ยนแหล่งที่มา แต่จะสร้างเอาต์พุตโดยใช้วิธีไปป์ไลน์ที่เหมาะสมแทน
-
Java Streams ขึ้นอยู่กับการดำเนินการระดับกลางและเทอร์มินัล ซึ่งเราจะกล่าวถึงในหัวข้อต่อไปนี้
-
ใน Java Stream การดำเนินการระดับกลางจะถูกไปป์ไลน์และเกิดขึ้นในรูปแบบการประเมินแบบ Lazy ปิดท้ายด้วยฟังก์ชันเทอร์มินัล นี่เป็นรูปแบบพื้นฐานสำหรับการใช้ 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 จึงเป็นไปได้ ไปป์ไลน์ช่วยติดตามการดำเนินงานขั้นกลางที่ต้องดำเนินการหลังจากพบการทำงานของเทอร์มินัลในที่สุดบทสรุป
ให้เราสรุปสิ่งที่เราได้เรียนรู้ในวันนี้ ในบทความนี้:- เรามาดูกันคร่าวๆ ว่า Java Streams คืออะไร
- จากนั้นเราได้เรียนรู้เทคนิคต่างๆ มากมายสำหรับการสร้างเธรด Java ใน Java 8
- เราเรียนรู้การดำเนินงานหลักสองประเภท (การดำเนินงานระดับกลางและการดำเนินงานเทอร์มินัล) ที่สามารถทำได้บนสตรีม Java
- จากนั้นเราดูรายละเอียดหลายตัวอย่างของการดำเนินการทั้งระดับกลางและเทอร์มินัล
- เราได้เรียนรู้เพิ่มเติมเกี่ยวกับการประเมินแบบ Lazy Evasion และสุดท้ายก็เรียนรู้เกี่ยวกับ Pipelining ใน Java Threads
GO TO FULL VERSION