-
스트림은 데이터를 추상화해서 데이터 소스가 무엇이든 간에 같은 방식으로 다룰 수 있게 하는 기능이다.
스트림은 데이터 소스를 변경하지 않고 읽기만 할 뿐이며 일회용으로 사용된다.
스트림의 과정
1. 스트림 생성
2. 중간 연산
3. 최종 연산
데이터 소스 --------> 중간 연산 --------> 최종 연산 컬렉션, 배열 등 n번 가능 1번만 가능
중간 연산 - 연산결과가 스트림인 연산. 반복적으로 n번 적용 가능
최종 연산 - 연산결과가 스트림이 아닌 연산. 단 한번만 적용가능(스트림의 요소를 소모)
stream.distinct().limit(5).sorted().forEach(System.out::println)
여기서 distinct(), limit(5), sorted() 등의 연산이 중간연산이고, forEach(System.out::println)이 최종 연산이다.
String[] strArr = { "aa", "bbb", "cc", "ddd", "ee" }; Stream<String> stream = Stream.of(strArr); Stream<String> filterdStream = stream.filter(); // 걸러내기 (중간 연산) Stream<String> distinctedStream = stream.distinct(); // 중복제거 (중간 연산) Stream<String> sortedStream = stream.sort(); // 정렬 (중간 연산) Stream<String> limitedStream = stream.limit(5); // 자르기 (중간 연산) int total = stream.count() // 요소 개수 세기 (최종 연산)
스트림 선언 이후의 4줄은 전부 중간 연산이기 때문에 여러 번 반복해도 상관이 없다. 하지만 마지막의 stream.count()는 최종 연산이기 때문에 이 연산을 진행 후에는 stream이 닫히게 되어서 사용할 수 없게 된다.
스트림 특징
1. 데이터를 읽기만할 뿐 변경하지 않는다.
2. 스트림은 일회용이다. (필요하면 다시 스트림을 생성해야 함)
3. 최종 연산 전까지 중간연산이 수행되지 않는다. - 지연된 연산
1. 데이터를 읽기만할 뿐 변경하지 않는다.
List<Integer> list = Array.asList(3,1,5,4,2); List<Integer> sortedList = list.stream().sorted() .collect(Collectors.toList()); System.out.println(list); // [3, 1, 5, 4, 2] System.out.println(sortedList); // [1, 2, 3, 4, 5]
list.stream().sorted().collect(Collectors.toLists())를 통해 list를 정렬한 다음 Collectors.toList()에 따라 정렬된 값을 sortedList에 저장한다.
이 때 아래의 출력값을 통해 알 수 있겠지만 list 원본 자체는 정렬이 되지 않았고, 스트림의 반환값을 통해 새로 저장된 sortedList만 정렬된 것을 알 수 있다.
2. 스트림은 일회용이다. (필요하면 다시 스트림을 생성해야 함)
strStream.forEach(System.out::println); // 모든 요소를 화면에 출력 (최종연산) int numOfStr = strStream.count(); // 스트림이 이미 닫혀서 에러
3. 최종 연산 전까지 중간연산이 수행되지 않는다. - 지연된 연산
IntStream intStream = new Random().ints(1, 46); // 1 ~ 45번의 무한 스트림 intStream.distinct().limit(6).sorted() // 중간 연산 .forEach(i -> System.out.println(i+",") // 최종 연산
무한 스트림인데 중복제거를 한 다는 것이 이상하지만 중간 연산이 바로 실행되는 것이 아니라 지연 연산으로 인해서 필요할 때에 중복제거 후 6개만 잘라서 저장한다는 특징이 있다.
'JAVA > 스트림' 카테고리의 다른 글
collect()와 Collectors (0) 2023.08.09 Optinal (0) 2023.08.09 스트림의 연산 - 최종 연산 (0) 2023.08.08 스트림의 연산 - 중간 연산 (0) 2023.08.08 스트림 만들기 (0) 2023.08.08