Luồng cung cấp sự trừu tượng hóa tốt hơn nhiều cho thành phần của các hoạt động khác nhau mà bạn muốn thực hiện trên đầu các bộ sưu tập hoặc luồng dữ liệu đến. Đặc biệt là khi bạn cần ánh xạ các thành phần, lọc và chuyển đổi chúng.
Ví dụ của bạn không thực tế lắm. Hãy xem xét các mã sau đây từ trang web của Oracle .
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());
}
có thể được viết bằng luồng:
List<Integer> transactionsIds =
transactions.stream()
.filter(t -> t.getType() == Transaction.GROCERY)
.sorted(comparing(Transaction::getValue).reversed())
.map(Transaction::getId)
.collect(toList());
Tùy chọn thứ hai dễ đọc hơn nhiều. Vì vậy, khi bạn có các vòng lặp lồng nhau hoặc các vòng lặp khác nhau để xử lý một phần, đó là ứng cử viên rất tốt cho việc sử dụng API Streams / Lambda.