1. การตรวจสอบ
ฉันคิดว่าคุณคงเบื่อกับการเรียนรู้วิธีเชื่อมโยงสตรีมข้อมูลเข้าด้วยกันแล้ว คุณต้องการทำบางสิ่งกับข้อมูลในที่สุด
คลาสStream
มีสามวิธีมาตรฐานที่ไม่สร้างสตรีม แต่ให้ตรวจสอบชนิดของข้อมูลที่อยู่ในนั้นแทน วิธีการเหล่านี้ได้แก่ , anyMatch()
, allMatch()
และnoneMatch()
.
boolean anyMatch(rule)
วิธี
เมธอดนี้จะตรวจสอบว่าสตรีมมีองค์ประกอบอย่างน้อยหนึ่งรายการที่เป็นไปตามกฎที่ส่งผ่านไปยังเมธอดหรือไม่ หากมีองค์ประกอบดังกล่าว เมธอดจะส่งคืนมิtrue
ฉะนั้นfalse
ตัวอย่าง
รหัส | บันทึก |
---|---|
|
|
|
|
|
|
ในตัวอย่างสุดท้าย อันดับแรกเราจะคงไว้เฉพาะองค์ประกอบที่น้อยกว่าศูนย์ จากนั้นเราจะตรวจสอบผลลัพธ์เพื่อดูว่ามีองค์ประกอบที่กรองแล้วมีค่ามากกว่าศูนย์หรือไม่ แน่นอนว่าไม่มีองค์ประกอบดังกล่าวอีกต่อไป
วิธีการบูลีน allMatch (กฎ)
วิธีนี้ตรวจสอบว่าองค์ประกอบทั้งหมดในสตรีมตรงกับกฎหรือไม่ (หรือที่เรียกว่าเพรดิเคต) กฎจะถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังเมธอด:
รหัส | บันทึก |
---|---|
|
(องค์ประกอบทั้งหมดที่มากกว่าศูนย์) |
|
(มีองค์ประกอบที่น้อยกว่าหรือเท่ากับศูนย์หรือไม่) |
|
(เราคงองค์ประกอบที่น้อยกว่าศูนย์ไว้) |
ในตัวอย่างสุดท้าย อันดับแรก เราอนุญาตให้เฉพาะองค์ประกอบที่น้อยกว่าศูนย์ผ่านตัวกรอง จากนั้นเราจะตรวจสอบว่าองค์ประกอบที่คงไว้ทั้งหมดมีค่าน้อยกว่าศูนย์หรือไม่ ตรวจสอบให้ผลบวก
วิธีการบูลีน noneMatch (กฎ)
เมธอดnoneMatch()
ตรวจสอบว่าสตรีมไม่มีองค์ประกอบที่ตรงกับกฎที่ผ่านหรือไม่ มันเหมือนตรงกันข้ามกับanyMatch()
วิธีการ
รหัส | บันทึก |
---|---|
|
|
|
|
|
|
2. คลาสยูทิลิตี้: Optional
คลาส
บางครั้งก็ไม่สะดวกสำหรับโปรแกรมเมอร์ในการทำงานกับnull
การอ้างอิง ตัวอย่างเช่น สมมติว่าคุณกำลังเปรียบเทียบสองสตริง หากตัวแปรทั้งสองไม่ใช่null
คุณก็สามารถเรียกs1.equals(s2)
และทุกอย่างจะทำงานได้ แต่ถ้าs1
เป็นไปได้ คุณต้องเขียนโค้ดที่จัดการกับสถานการณ์ นี้null
เพื่อหลีกเลี่ยงNullPointerException
Optional<T>
นั่นเป็นเหตุผลที่โปรแกรมเมอร์ สร้างคลาสยูทิลิตี้ขึ้นมา รหัสของมันมีลักษณะดังนี้:
รหัส | บันทึก |
---|---|
|
ตรวจสอบว่าค่าไม่ใช่ null ตรวจสอบว่าค่านั้น null ส่งคืนค่าที่เก็บไว้หรือไม่ ส่งข้อยกเว้นหากค่าเป็นโมฆะ ส่งกลับค่าที่ไม่ใช่ค่าว่างที่เก็บไว้ หรือถ้าค่าที่เก็บไว้คือ null จะส่งกลับค่าที่ส่งผ่านเป็นอาร์กิวเมนต์เมธอด ส่งคืนค่าที่ไม่ใช่ค่า Null ที่เก็บไว้หรือส่งข้อยกเว้นหากค่านั้นเป็นค่าว่าง |
จุดประสงค์ของคลาสนี้คือเพื่อจัดเก็บวัตถุ T (การอ้างอิงถึงวัตถุที่มีประเภทคือ T) การอ้างอิงวัตถุภายในOptional<T>
วัตถุสามารถเป็นnull
ได้
คลาสนี้ช่วยให้โปรแกรมเมอร์เขียนโค้ดได้สวยขึ้นเล็กน้อย ลองเปรียบเทียบ:
ใช้ตัวเลือก | ไม่ใช้ตัวเลือก |
---|---|
|
|
วัตถุ หนึ่งOptional
สามารถเปรียบเทียบได้เสมอกับOptional
วัตถุอื่นโดยใช้equals
เมธอด แม้ว่าจะเก็บnull
ข้อมูลอ้างอิงไว้ ก็ตาม
พูดง่ายๆOptional
คลาสนี้ให้คุณเขียนการตรวจสอบ "สวยงาม" null
และการกระทำ "สวยงาม" ในกรณีที่Optional
ออบเจกต์เก็บnull
ค่าไว้
3. การหาองค์ประกอบ
กลับไปที่Stream
ชั้นเรียน กันเถอะ คลาส นี้Stream
มีเมธอดอีก 4 เมธอดที่ให้คุณค้นหาอิลิเมนต์ในสตรีมได้ วิธีการเหล่านี้คือfindFirst()
, findAny()
, min()
, max()
และ
Optional<T> findFirst()
วิธี
วิธีfindFirst()
การเพียงแค่ส่งกลับองค์ประกอบแรกในกระแส นั่นคือทั้งหมดที่ทำ
สิ่งที่น่าสนใจที่ควรทราบคือเมธอดนี้ไม่ได้ส่งคืนT
ออบเจกต์ แต่เป็นOptional<T>
ออบเจกต์ของ wrapper สิ่งนี้ทำให้มั่นใจได้ว่าเมธอดจะไม่กลับมาnull
หลังจากค้นหาอ็อบเจกต์ไม่สำเร็จ
ตัวอย่าง:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String str = list.stream().findFirst().get(); // Hello
เพื่อความชัดเจนยิ่งขึ้น เราจะแบ่งบรรทัดสุดท้ายออกเป็นหลายบรรทัด:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Hello
วิธี สุดท้ายget()
คือดึงค่าที่เก็บไว้ภายในOptional
วัตถุ
Optional<T> findAny()
วิธี
เมธอดfindAny()
ส่งคืนองค์ประกอบใด ๆ จากสตรีมและสิ้นสุดที่นั่น วิธีนี้คล้ายกับfindFirst()
แต่เป็นวิธีที่ดีสำหรับสตรีมที่ใช้ในการดำเนินการแบบขนาน
เมื่อประมวลผลสตรีมแบบขนาน อาจเป็นองค์ประกอบที่พบในบางส่วนของสตรีม แต่ยังไม่ชัดเจนว่าเป็นองค์ประกอบแรกหรือไม่
หากมีองค์ประกอบหลายอย่างที่ตรงกับตัวกรองทั้งหมด และเป็นสิ่งสำคัญสำหรับโปรแกรมเมอร์ที่จะต้องได้รับองค์ประกอบแรกทุกประการ วิธีการนั้นfindFirst()
คือสิ่งที่ควรเรียก หากโปรแกรมเมอร์รู้ว่าในความเป็นจริงองค์ประกอบ 0 หรือ 1 จะตรงกับตัวกรองทั้งหมด มันก็เพียงพอแล้วที่จะเรียกfindAny()
— และจะเร็วขึ้น
Optional<T> min(Comparator<T>)
วิธี
เมธอดmin()
ใช้comparator
วัตถุเพื่อเปรียบเทียบองค์ประกอบทั้งหมดในสตรีมและส่งกลับองค์ประกอบขั้นต่ำ วิธีที่สะดวกที่สุดในการกำหนดวัตถุเปรียบเทียบคือการใช้ฟังก์ชันแลมบ์ดา
ตัวอย่างการค้นหาสตริงที่สั้นที่สุด:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();
Optional<T> max(Comparator<T>)
วิธี
เมธอดmax()
ใช้comparator
วัตถุเพื่อเปรียบเทียบองค์ประกอบทั้งหมดในสตรีมและส่งกลับองค์ประกอบสูงสุด วิธีที่สะดวกที่สุดในการกำหนดวัตถุเปรียบเทียบคือการใช้ฟังก์ชันแลมบ์ดา
ตัวอย่างการค้นหาสตริงที่ยาวที่สุด:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max( (s1, s2)-> s1.length()-s2.length() ).get();
GO TO FULL VERSION