Потоки забезпечують набагато кращу абстракцію для композицій різних операцій, які ви хочете робити над колекціями або потоками даних, що надходять. Особливо, коли вам потрібно зіставити елементи, відфільтрувати та перетворити їх.
Ваш приклад не дуже практичний. Розглянемо наступний код з сайту 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());
}
можна записати за допомогою потоків:
List<Integer> transactionsIds =
transactions.stream()
.filter(t -> t.getType() == Transaction.GROCERY)
.sorted(comparing(Transaction::getValue).reversed())
.map(Transaction::getId)
.collect(toList());
Другий варіант набагато читабельніший. Тож, коли ви вклали петлі або різні цикли, які роблять часткову обробку, це дуже хороший кандидат для використання API Streams / Lambda.