คำตอบคือ "ขึ้นอยู่กับ" เช่นเคย ขึ้นอยู่กับว่าคอลเล็กชันที่ส่งคืนจะใหญ่แค่ไหน ขึ้นอยู่กับว่าผลลัพธ์จะเปลี่ยนแปลงไปตามเวลาหรือไม่และความสอดคล้องที่สำคัญของผลลัพธ์ที่ส่งคืนคืออะไร และขึ้นอยู่กับว่าผู้ใช้มีแนวโน้มที่จะใช้คำตอบอย่างไร
ก่อนอื่นโปรดทราบว่าคุณสามารถรับคอลเล็กชันจากสตรีมได้ตลอดเวลาและในทางกลับกัน:
// If API returns Collection, convert with stream()
getFoo().stream()...
// If API returns Stream, use collect()
Collection<T> c = getFooStream().collect(toList());
ดังนั้นคำถามคือซึ่งมีประโยชน์มากขึ้นสำหรับผู้โทรของคุณ
หากผลลัพธ์ของคุณอาจไม่มีที่สิ้นสุดมีเพียงตัวเลือกเดียวเท่านั้น: สตรีม
หากผลลัพธ์ของคุณอาจมีขนาดใหญ่มากคุณอาจชอบสตรีมเนื่องจากอาจไม่มีค่าใด ๆ ในการทำให้เป็นจริงทั้งหมดในครั้งเดียวและการทำเช่นนั้นอาจสร้างแรงกดดันให้กับกองมาก
หากผู้เรียกทั้งหมดกำลังทำซ้ำมัน (การค้นหาตัวกรองการรวม) คุณควรเลือกสตรีมเนื่องจากสตรีมมีบิวท์อินเหล่านี้อยู่แล้วและไม่จำเป็นต้องสร้างคอลเลกชัน (โดยเฉพาะถ้าผู้ใช้อาจไม่ประมวลผล ผลลัพธ์ทั้งหมด) นี่เป็นกรณีที่พบบ่อยมาก
แม้ว่าคุณจะรู้ว่าผู้ใช้จะวนซ้ำหลายครั้งหรืออย่างอื่นก็ตามคุณยังอาจต้องการคืนค่ากระแสข้อมูลแทนเนื่องจากความจริงง่ายๆที่คอลเลกชันใด ๆ ที่คุณเลือกที่จะใส่ไว้ใน (เช่น ArrayList) อาจไม่ใช่ รูปแบบที่พวกเขาต้องการแล้วผู้โทรจะต้องคัดลอกมันต่อไป หากคุณส่งคืนสตรีมพวกเขาสามารถทำได้collect(toCollection(factory))
และรับมันในแบบฟอร์มที่พวกเขาต้องการ
กรณี "ชอบสตรีม" ด้านบนส่วนใหญ่มาจากข้อเท็จจริงที่ว่าสตรีมนั้นมีความยืดหยุ่นมากกว่า คุณสามารถผูกมัดกับวิธีการใช้งานของคุณได้โดยไม่ต้องเสียค่าใช้จ่ายและข้อ จำกัด ในการทำให้เป็นจริงในคอลเล็กชัน
กรณีหนึ่งที่คุณต้องส่งคืนคอลเลกชันคือเมื่อมีข้อกำหนดด้านความมั่นคงที่แข็งแกร่งและคุณต้องสร้างภาพรวมที่สอดคล้องกันของเป้าหมายที่เคลื่อนไหว จากนั้นคุณจะต้องใส่องค์ประกอบลงในคอลเลกชันที่จะไม่เปลี่ยนแปลง
ดังนั้นฉันจะบอกว่าส่วนใหญ่เวลาสตรีมเป็นคำตอบที่ถูกต้อง - มีความยืดหยุ่นมากกว่าไม่คิดค่าใช้จ่ายที่ไม่จำเป็นและมักจะกลายเป็นคอลเลคชันที่คุณเลือกได้ตามต้องการ แต่บางครั้งคุณอาจต้องส่งคืนคอลเล็กชัน (พูดเนื่องจากมีข้อกำหนดที่เข้มงวดมาก) หรือคุณอาจต้องการส่งคืนคอลเล็กชันเนื่องจากคุณทราบว่าผู้ใช้จะใช้งานอย่างไรและรู้ว่านี่เป็นสิ่งที่สะดวกที่สุดสำหรับพวกเขา
players.stream()
เป็นเพียงวิธีการดังกล่าวซึ่งจะส่งกลับกระแสไปยังผู้โทร คำถามจริงคือคุณต้องการ จำกัด ผู้โทรไปยังการสำรวจเส้นทางเดียวและปฏิเสธการเข้าถึงคอลเลกชันของคุณผ่านCollection
API หรือไม่? ผู้โทรอาจต้องการไปaddAll
ยังคอลเล็กชันอื่นหรือไม่