สตรีมให้ความเป็นนามธรรมที่ดียิ่งขึ้นสำหรับองค์ประกอบของการดำเนินงานที่แตกต่างกันที่คุณต้องการทำบนคอลเลกชันหรือกระแสข้อมูลที่เข้ามาโดยเฉพาะอย่างยิ่งเมื่อคุณต้องการแมปองค์ประกอบกรองและแปลง
ตัวอย่างของคุณใช้งานไม่ได้จริง ๆ พิจารณารหัสต่อไปนี้จากเว็บไซต์ของออราเคิล
List<Transaction> groceryTransactions = new Arraylist<>();
for(Transaction t: transactions){
if(t.getType() == Transaction.GROCERY){
groceryTransactions.add(t);
}
}
Collections.sort(groceryTransactions, new Comparator(){
public int compare(Transaction t1, Transaction t2){
return t2.getValue().compareTo(t1.getValue());
}
});
List<Integer> transactionIds = new ArrayList<>();
for(Transaction t: groceryTransactions){
transactionsIds.add(t.getId());
}
สามารถเขียนได้โดยใช้สตรีม:
List<Integer> transactionsIds =
transactions.stream()
.filter(t -> t.getType() == Transaction.GROCERY)
.sorted(comparing(Transaction::getValue).reversed())
.map(Transaction::getId)
.collect(toList());
ตัวเลือกที่สองสามารถอ่านได้มากขึ้น ดังนั้นเมื่อคุณมีลูปซ้อนกันหรือลูปต่าง ๆ ที่ทำการประมวลผลบางส่วนมันเป็นตัวเลือกที่ดีมากสำหรับการใช้งาน Streams / Lambda API