스트림(Stream)
출처 - Java의 정석 기초편 (남궁 성)
1. 스트림
- 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것
- 컬렉션(List, Set, Map), 배열→스트림
- 작업처리: 스트림 만들기→중간연산(0~n번)→최종연산(0~1번)
String[] strArr = { "aaa", "bbb", "ccc" };
List<String> strList = Arrays.asList(strArr);
Stream<String> strStream1 = strList.stream(); // 스트림 생성
Stream<String> strStream2 = Arrays.stream(strArr); // 스트림 생성
strstream1.sorted().forEach(System.out::println);
strstream2.sorted().forEach(System.out::println);
2. 스트림 특징
- 데이터 소스를 변경하지 않음(Read Only)
- 일회용: 최종연산(스트림 닫힘)→스트림 다시 생성
- 내부 반복: 반복문을 메서드 내부에 숨김
- 지연된 연산: 최종연산 전까지 중간연산 수행되지 않음
- 기본형 스트림: 오토-언박싱 비효율 제거, 숫자 관련 메서드 제공(Stream<Integer>→IntStream, LongStream, DoubleStream)
- 병렬 스트림: parallel()↔sequential() 호출
3. 스트림 만들기
- 컬렉션
- 배열
- 임의의 수(난수)
- 특정 범위의 정수
- 람다식 iterate(), generate()
- 파일
- 빈 스트림
4. 컬렉션 스트림
- Collection인터페이스의 stream()으로 컬렉션→스트림 반환
List<Integer> list = Arrays.asList(1,2,3,4,5);
Stream<Integer> intStream = list.stream(); // list를 소스로 하는 스트림 생성
5. 배열 스트림
- 객체 배열로부터 스트림 생성
- Stream과 Arrays(편한 것 사용)
Stream<T> Stream.of(T... values) // 가변 인자
Stream<T> Stream.of(T[]) // 배열
Stream<T> Arrays.stream(T[]) // 편한 것 사용
Stream<T> Arrays.stream(T[] array, int startInclusive, int endExclusive) // 배열의 일부 freom~to
Stream<String> strStream=Stream.of("a","b","b");
Stream<String> strStream=Stream.of(new String[]{"a","b","c"});
Stream<String> strStream=Arrays.stream.of(new String[]{"a","b","c"});
Stream<String> strStream=Arrays.stream.of(new String[]{"a","b","c"}, 0, 3);
IntStream IntStream.of(int… values)
IntStream IntStream.of(int[])
IntStream Arrays.stream(int[])
IntStream Arrays.stream(int[] array,int startInclusive,int endExclusive)
6. 난수 스트림
- 난수를 요소로 갖는 스트림 생성
- Random()클래스에 기본형 스트림 반환하드 메서드
- 무한 스트림→limit() →유한 스트림
IntStream ints()
LongStream longs()
DoubleStream doubles()
// 매개변수로 스트림 크기 지정→유한 스트림
IntStream intStream = new Random().ints(); // 무한 스트림
intStream.limit(5).forEach(System.out::println); // 유한 스트림
IntStream intStream = new Random().int(5); // 크기 5인 난수 스트림
7. 특정 범위의 정수 스트림
- 특정 범위의 정수를 요소로 갖는 스트림 생성
- range(), rangeClosed()
IntStream IntStream.range(int begin, int end) // 끝 미포함
IntStream IntStream.rangeClosed(int begin, int end) // 끝 포함
8. 람다식 스트림
- 람다식을 소스로 하는 스트림 생성
- iterate(T seed, UnaryOperator f): 이전 요소를 seed로 다음 요소 계산
- generate(Supplier s): seed 사용 안 함
Stream<Integer> evenStream = Stream.iterate(0, n→n+2);
Stream<Integer> oneStream = Stream.generate(()→1);
9. 파일과 빈 스트림
- 파일을 소스로 하는 스트림 생성
- 비어있는 스트림 생성: null보다 나음
Stream emptyStream = Stream.empty(); // 빈 스트림 생성해서 반환
long count = emptyStream.count(); // count 값 0
10. 스트림 연산
- 스트림 만들기
- 중간 연산: 연산 결과가 스트림(n번)
- 최종 연산: 연산 결과가 스트림이 아님, 스트림의 요소 소모(1번)
stream.distinct().limit(5).sorted().forEach(System.out::println)