스트림 (Stream)
스트림의 특징
선언형으로 데이터 소스를 처리
람다식 요소처리 코드 제공
내부 반복자를 사용하므로 병렬 처리가 쉽다
중간연산과 최종연산을 할 수 있다
리덕션(Reduction) : 다량의 데이터를 가공해서 축소하는 것
파이프라인(pipelines) : 여러개의 스트림이 연결되어있는 구조
double ageAve = list.stream() // 오리지널 스트림
.filter(m -> m.getGender() == Member.MALE) // 중간연산 스트림
.mapToInt(Member::getAge) // 중간연산 스트림
.average() // 최종연산
.getAsDouble();
스트림 생성
// list 생성
List<String> list = Arrays.asList("a", "b", "c");
// list로 stream 생성
Stream<String> listStream = list.stream();
// stream의 모든 요소 출력
listStream.forEach(System.out::println);
// 배열로부터 스트림 생성
Stream<String> stream = Stream.of("a", "b", "c"); // 가변인자
Stream<String> stream = Stream.of(new String[] {"a", "b", "c"});
Stream<String> stream = Arrays.stream(new String[] {"a", "b", "c"});
Stream<String> stream = Arrays.stream(new String[] {"a", "b", "c"}, 0, 3); // end 범위 미포함
// 특수 종류 Stream 사용 (IntStream, LongStream, DoubleStream 등등)
// 4 이상 10 미만의 수를 갖는 IntStream
// IntStream 은 range() 함수를 사용하여 for문 대체 가능
IntStream stream = IntStream.range(4, 10);
Collection VS Stream
Collection | Stream | |
---|---|---|
목적 | 특정 자료구조를 통해 데이터를 저장 | 데이터 가공처리 |
데이터 수정 가능 유무 | 데이터 추가/삭제 가능 | 데이터 추가/삭제 불가 |
Iteration | for문 등의 외부 반복자 사용 | operation 메서드 내부에서 보이지 않게 내부반복자 |
탐색 | 여러번 가능 | 한번만 가능 |
데이터 처리방식 | Eager | Lazy, Short-circuit |
Optional< T >
of()
또는 ofNullable()
사용ofNullable()
사용