Stream API
Stream의 정의
- Stream API는 Lambda Expression을 이용한 기술 중 하나로 데이터 소스를 조작 및 가공, 변환하여 원하는 값으로 반환해주는 interface 입니다.
- 해당 기능을 사용하기 위해서는 Java 1.8 이상의 버전을 사용해야 합니다.
- 해당 Stream interface는 java.util.stream에 포함되어 있습니다.
Stream 타입 별 객체의 종류
분류 | 타입 | Stream Type |
---|
정수형 | byte | Stream<Byte> |
정수형 | short | Stream<Short> |
정수형 | int | IntStream |
정수형 | long | LongStream |
문자형 | char | Stream |
실수형 | float | Stream<Float> |
실수형 | double | DoubleStraem |
문자열 | String | Stream<String> |
논리형 | boolean | Stream<Boolean> |
Stream의 특징
1. 원본 데이터를 변경하지 않습니다.
- Stream API는 원본 데이터를 조회하여 별도의 Stream 객체로 생성합니다.
- 그렇기에 배열의 정렬이나 필터링 작엄을 하더라도 원본 데이터를 변경하지 않습니다.
2. 재사용이 불가능하여 일회용으로 사용됩니다.
- Stream API는 이미 사용이 되어 닫혔다면 재사용이 불가능합니다.
3. 내부 반복으로 작업을 처리합니다.
- Stream 내에서 내부적으로 반복문을 처리하기에 간결한 소스코드의 작성이 가능합니다.
Stream의 과정
- Stream 객체를 구성하고자 할때에 "Stream 생성 -> 중간 연산 -> 최종 연산"의 세 단계의 과정을 통해 처리가 이루어 집니다.
Object.Stream().middle().final()
1. Stream 생성
분류 | 상세 분류 |
---|
Stream 생성 | empty stream |
Stream 생성 | Collection |
Stream 생성 | Array |
Stream 생성 | Stream.builder() |
Stream 생성 | Stream.generate() |
Stream 생성 | Stream.Iterator() |
Stream 생성 | 기본 타입 스트림 |
Stream 생성 | 파일 스트림 |
2. 중간연산
분류 | 상세 분류 |
---|
Stream 필터 | filter(), distinct() |
Stream 변환 | map(), flatMap() |
Stream 제한 | limit(), skip() |
Stream 정렬 | sorted() |
Stream 연산 결과 확인 | peek() |
3. 최종연산
분류 | 상세 분류 |
---|
요소의 출력 | forEach() |
요소의 검색 | findFirst(), findAny() |
요소의 검사 | anyMatch(), allMatch(), noneMatch() |
요소의 통계 | count(), min(), max() |
요소의 연산 | sum(), average() |
요소의 수집 | collect() |
Stream - 생성
Stream<Object> emptyStream = Stream.empty();
List<String> strList = new ArrayList<>(Arrays.asList("a","b","c","d"));
Stream<String> strStream = strList.stream();
String[] strArr = {"a", "b", "c", "d"};
Stream<String> strStream2 = Arrays.stream(strArr);
Stream<String> strStream3 = Stream.of(strArr);
Stream<String> strStream4 = Stream.of("one", "two", "three");
Stream<String> builderStream = Stream.<String>builder()
.add("a")
.add("b")
.add("c")
.add("d")
.build();
Stream<String> generatedStream = Stream.generate(() -> "abcd").limit(3);
Stream<Integer> iteratedStream = Stream.iterate(70, (n) -> n + 10).limit(3)
IntStream intStream = IntStream.range(1,5);
LongStream longStream = LongStream.rangeClosed(1,5);
DoubleStream doubleStream = DoubleStream.iterate(100, (n) -> n+10).limit(3);
Stream<String> fileToStrStream = Files.lines(Paths.get("file.txt"), Charset.forName("UTF-8"));
참고자료