스트림(Stream)
스트림은 데이터소스를 추상화하고 자주 사용되는 메서드를 정의해놓았다. 데이터 소스 추상화는 데이터 소스가 무엇이던 간에(ArrayList이든 Array이든) 같은 방식으로 다룰 수 있게 되었다는 것과 코드 재사용성이 높아졌다는 것을 의미한다.
예시
// 배열과 배열리스트 String[] strArr = {"a", "b", "c"}; List<String> strList = Arrays.asList(strArr); // 스트림 생성 Stream<String> strStream1 = Arrays.stream(strArr); Stream<String> srtStream2 = strList.stream(); // 스트림 정렬 및 출력 strStream1.sorted().forEach(System.out::println); strStream2.sorted().forEach(System.out::println); // 기존의 정렬 및 출력 Arrays.sort(strArr); Collections.sort(strList); for(String str : strArr) { System.out.println(str); } for(String str : strList) { System.out.println(str); }
위 예시에서 두 스트림의 데이터소스는 다르지만 정렬 및 출력 문법이 동일하다.
스트림의 특성
immutable이다. 데이터 소스를 읽기만 할 뿐 변경하지 않는다. 재사용을 위해서는 컬렉션이나 배열에 담아서 반환할 수 있다.
일회용이다. Iterator처럼 일회용이므로 한 번 사용하면 다시 사용할 수 없다. 필요하다면 다시 생성해야 한다.
작업을 내부반복으로 처리한다. 즉 메서드 내부에 반복문을 숨긴다. forEach()가 그 예이다.
스트림의 연산 예시
- 중간 연산: filter(), sorted(), map(), flatMap(), limit() 둥
- 최종 연산: reduce(), collect()