반응형
반응형
해당 글의 목적은 Stream API를 이해하고 예제를 통한 이해를 돕기 위해 작성한 글입니다. 주된 내용은 Stream과 관련된 용어를 이해하며 Stream을 생성하는 메서드에 대해서 이해합니다. 해당 글에서는 모든 함수에 대해서는 포함하고 있지 않으며 자주 사용되는 함수 위주로 작성하였습니다.
1) Stream API
1. Stream 정의
💡 스트림(Stream) API 이란?
- 스트림(Stream) API은 람다식(Lambda Expression)를 이용한 기술 중에 하나로 데이터 소스(컬렉션, 배열, 난수, 파일 등…)를 조작 및 가공, 변환하여 원하는 값으로 반환해주는 인터페이스를 의미합니다.
- 해당 기능을 사용하기 위해서는 Java 1.8 이상의 버전을 사용해야 합니다.
- 해당 스트림 인터페이스는 import java.util.stream 에 포함되어 있습니다.
💡 [더 알아보기]
💡 람다식(Lambda Expression) 이란?
- 함수를 하나의 식으로 표현한 함수형 인터페이스로 함수를 람다식으로 표현을 하면 메소드의 이름이 없기 때문에 익명 함수(Anonymous Funtion)의 한 종류라고도 합니다.
💡 컬렉션 프레임워크(Collection Framework)란?
- 컬렉션 프레임워크는 프레임워크 내에 Collection(List, Set), Queue, Map의 인터페이스로 구성이 되어 있는 프레임워크를 의미합니다.
- 해당 기능을 사용하기 위해서는 Java 1.2 이상의 버전을 사용해야 합니다.
- 해당 컬렉션 프레임워크는 import java.util 내에 포함이 되어 있습니다.
💡 컬렉션 인터페이스 내의 클래스 종류
- List 인터페이스에는 컬렉션 클래스로 ArrayList, Vector, Stack, LinkedList가 있습니다.
- Map 인터페이스에는 컬렉션 클래스로는 HashMap, TreeMap, LikendHashMap가 있습니다.
- Set 인터페이스에는 컬렉션 클래스로는 HashSet, TreeSet, LinkedHashSet가 있습니다.
2. Stream 타입 별 객체의 종류
💡기본 자료형들을 기반으로 Stream 객체로 구성하기 구성하는 데이터 타입에 대해 알아봅니다.
분류 | 타입 | Stream Type |
정수형 | byte | Stream<Byte> |
정수형 | short | Stream<Short> |
정수형 | int | IntStream |
정수형 | long | LongStream |
문자형 | char | Stream<Character> |
실수형 | float | Stream<Float> |
실수형 | dobule | DoubleStream |
문자열 | String | Stream<String> |
논리형 | boolean | Stream<Boolean> |
[ 더 알아보기 ]
💡 기본 자료형(Primitive Data Type)
- 데이터를 저장하기 위해 사용되는 자료형을 의미하며 해당 자료형 내에 "실제 값"을 가지는 것을 의미합니다.
3. Stream의 특징
1. Stream은 원본의 데이터를 변경하지 않는다.
💡 Stream API는 원본 데이터를 조회하여 별도의 Stream 객체로 생성을 합니다. 그렇기에 배열의 정렬이나 필터링 작업을 하더라도 원본 데이터를 변경하지 않습니다.
2. Stream은 재 사용이 불가능하여서 일회용으로 사용됩니다.
💡 Stream API는 이미 사용이 되어 닫혔다면 재 사용이 불가능하여 java.lang.IllegalStateException 오류가 발생하며 새로운 Stream을 생성해주어야 합니다.
3. Stream은 내부 반복으로 작업을 처리합니다.
💡 Stream 내에서 내부적으로 반복문을 처리하기에 간결한 소스코드의 작성이 가능합니다.
4. Stream의 과정
💡 Stream의 객체를 구성하고자 할때에 "Stream 생성 → 중간 연산→ 최종 연산" 의 세 단계의 과정을 통하여서 처리가 이루어집니다. 해당 과정은 예시로 아래와 같이 표현이 됩니다.
// 객체의 Stream을 생성하고 중간 연산을 수행하고 최종 연산을 하여 결과값을 얻습니다.
객체.Stream생성().중간연산.최종연산()
5. Stream의 과정 상세
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() |
2) Stream API 활용 : 스트림(Stream) 생성
1. Stream 생성 관련 요약
분류 | 상세 분류 | 예제 |
Stream 생성 | empty stream 생성 | Stream.empty(); |
Stream 생성 | Collection 생성 | ArrayList.stream(); |
Stream 생성 | Array 생성-1 | Arrays.stream(Arr); |
Stream 생성 | Array 생성-2 | Stream.of("one", "two", "three") |
Stream 생성 | Stream.builder() 생성 | Stream.<String>builder().add("a").build(); |
Stream 생성 | Stream.generate()생성 | Stream.generate(() -> "a").limit(3); |
Stream 생성 | Stream.Iterator() 생성 | Stream.iterate(70, (n) -> n + 10).limit(3) |
Stream 생성 | 기본 타입 스트림 생성 | IntStream intStream = IntStream.range(1, 5); LongStream longStream = LongStream.rangeClosed(1, 5); DoubleStream doubleStream = DoubleStream.iterate(100, (n) -> n + 10).limit(3); |
Stream 생성 | 파일 스트림 생성 | Files.lines(Paths.get("file.txt"), Charset.forName("UTF-8")); |
2. 빈 스트림(Empty Stream) 생성
💡 빈 요소 값으로 스트림 객체를 구성할때 사용합니다.
/*
* 1. 요소 값이 존재하지 않는 빈 스트림 객체를 생성합니다.
*/
Stream<Object> emptyStream = Stream.empty();
3. 컬렉션 스트림(Collection Stream) 생성
💡 컬렉션 클래스의 요소 값으로 스트림 객체를 구성할때 사용합니다.
/*
* 2. 컬렉션 값이 존재하는 스트림 객체를 생성합니다.
*/
List<String> strList = new ArrayList<>(Arrays.asList("a", "b", "c", "d"));
Stream<String> strStream = strList.stream();
4. 배열 스트림(Array Stream)
💡 배열의 요소 값으로 스트림 객체를 구성할때 사용합니다.
/*
* 3. 배열 값이 존재하는 스트림 객체를 생성합니다.
*/
String[] strArr = {"a", "b", "c", "d"};
// [Type1]
Stream<String> strStream2 = Arrays.stream(strArr);
// [Type2]
Stream<String> strStream3 = Stream.of(strArr);
Stream<String> strStream4 = Stream.of("one", "two", "three");
5. 빌더 스트림(Builder Stream)
💡 빌더로 구성한 요소값들로 스트림 객체를 구성할때 사용합니다.
/*
* 4. 빌더로 값을 구성하여서 스트림 객체를 생성합니다.
*/
Stream<String> builderStream = Stream.<String>builder()
.add("a")
.add("b")
.add("c")
.add("d")
.build();
6. Stream.generate()
💡 generate() 함수내에서 람다(Lambda)로 값을 지정하여 스트림을 구성할때 사용합니다.
/*
* 5. generate() 함수내에서 람다(Lambda)로 값을 지정하여 스트림을 구성할때 사용합니다.
* 해당 스트림은 제한을 두지 않으면 무한으로 생성되기에 최대 크기를 지정합니다.
*/
Stream<String> generatedStream = Stream.generate(() -> "abcd").limit(3); // ["abcd", "abcd", "abcd",]
7. Stream.iterate()
💡 iterate() 함수내에서 람다(Lambda)로 값을 지정하여 스트림을 구성할때 사용합니다.
/*
* 6. iterate() 함수내에서 람다(Lambda)로 값을 지정하여 스트림을 구성할때 사용합니다.
*/
Stream<Integer> iteratedStream = Stream.iterate(70, (n) -> n + 10).limit(3); // [70, 80, 90]
8. 기본 타입형 스트림
💡 기본타입(int, long, double)으로 값을 지정하여 스트림을 구성할때 사용합니다.
/*
* 7. 기본 자료형(int, Long, Double)을 요소 값으로 지정하여 스트림을 구성할때 사용합니다.
*/
IntStream intStream = IntStream.range(1, 5);
LongStream longStream = LongStream.rangeClosed(1, 5);
DoubleStream doubleStream = DoubleStream.iterate(100, (n) -> n + 10).limit(3);
9. 파일 타입형 스트림
💡 파일 타입(File)을 요소값으로 지정하여 스트림을 구성할때 사용합니다.
/*
* 9. 파일 타입(File)을 요소값으로 지정하여 스트림을 구성할때 사용합니다.
*/
Stream<String> fileToStrStream = Files.lines(Paths.get("file.txt"), Charset.forName("UTF-8"));
오늘도 감사합니다. 😀
반응형
'Java > 공통 모듈' 카테고리의 다른 글
[Java] Stream API -3 이해하기: Stream 최종연산 (0) | 2023.02.14 |
---|---|
[Java] Stream API -2 이해하기: Stream 중간연산 (4) | 2023.02.08 |
[Java] 배열(Array) 조작 함수 이해하기-1: 기본 구성, Arrays 함수 (0) | 2023.01.30 |
[Java] 문자열(String) 조작 함수 이해하기 : 조작 및 비교 함수 (2) | 2023.01.21 |
[Java] 숫자(Number) 조작 함수 이해하기 : Math, 진법 변환 (2) | 2023.01.14 |