스트림은 수집되는 데이터 또는 데이터 스트림 위에서 수행하려는 다양한 작업의 구성에 대해 훨씬 더 나은 추상화를 제공합니다. 특히 요소를 매핑하고 필터링하고 변환해야하는 경우.
당신의 예는 그리 실용적이지 않습니다. 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());
두 번째 옵션은 훨씬 더 읽기 쉽습니다. 따라서 부분 처리를 수행하는 중첩 루프 또는 다양한 루프가있는 경우 Streams / Lambda API 사용에 매우 적합합니다.