Streaming menyediakan abstraksi yang jauh lebih baik untuk komposisi operasi berbeda yang ingin Anda lakukan di atas koleksi atau aliran data yang masuk. Terutama ketika Anda perlu memetakan elemen, memfilter dan mengubahnya.
Contoh Anda sangat tidak praktis. Pertimbangkan kode berikut dari situs 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());
}
dapat ditulis menggunakan stream:
List<Integer> transactionsIds =
transactions.stream()
.filter(t -> t.getType() == Transaction.GROCERY)
.sorted(comparing(Transaction::getValue).reversed())
.map(Transaction::getId)
.collect(toList());
Opsi kedua jauh lebih mudah dibaca. Jadi, ketika Anda memiliki loop bersarang atau berbagai loop melakukan pemrosesan parsial, itu kandidat yang sangat baik untuk penggunaan API Streams / Lambda.