❯ 스트림(Stream)
자바 8부터 도입된 문법으로 배열, 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 하는 반복자.
데이터 소스가 무엇인지에 관계 없이 같은 방식으로 데이터를 가공, 처리할 수 있도록 도와줌
스트림의 특징
- 생성, 중간연산, 최종연산 세단계로 이루어짐
- 원본 데이터 소스를 변경하지 않음
- 일회용임(한번 사용 후 사라짐)
- 내부 반복자임
스트림의 생성
- 배열 스트림 생성
배열을 데이터 소스로 하는 경우 Arrays 클래스의 stream( )메서드 또는 Stream 클래스의 of( ) 메서드 사용 가능
String[] arr = new String[] {"a", "b", "c"}; // 문자열 배열 선언 및 할당
Stream<String> stream1 = Arrays.stream(arr); // (1) Arrays 클래스와 메서드 활용한 스트림 생성
Steram<String> stream2 = Stream.of(arr); // (2) Stream 클래스와 메서드 활용한 스트림 생성
Arrays 클래스에는 int, long, double 기본형 배열을 데이터 소스로 스트림을 생성하는 메서드도 있음.
IntStream, DoubleStream, LongStream같은 기본형 요소를 사용한 스트림은 sum( ), average( ) 같은 숫자와 관련된 메서드가 정의되어있음.
- 컬렉션 스트림 생성
컬렉션의 최상위 클래스인 Collection에 정의된 stream( ) 메서드를 사용해 스트림을 생성할 수 있음
Collection의 하위 클래스인 List, Set을 구현한 컬렉션 클래스는 stream( ) 메서드 사용이 가능함
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7); // 숫자를 요소로 갖는 리스트
Stream<Integer> stream = list.stream(); // stream()메서드를 통해 스트림 생성
스트림의 중간연산
스트림의 생성 이후에 중간연산(Intermediate Operation)이 가능함
스트림 중간연산자의 연산 결과는 스트림을 반환하므로 여러개의 중간연산자 사용이 가능함
- 필터링
filter(람다식) : 람다식에 해당하는 데이터만을 정제
distinct( ) : 중복된 데이터 제거 - 매핑
map(람다식) : 람다식에 해당하는 원하는 필드만 추출하거나 특정 형태로 변환
flatMap(람다식) : 배열을 요소로 갖는 등 중첩구조가 있을 경우 중첩 구조를 제거하고 단일 컬렉션으로 변환 - 정렬
sorted(람다식) : 요소를 조건식대로 정렬할 때 사용. 값을 넣지 않으면 기본정렬(오름차순)으로 정렬됨 - 기타
skip( ) : 스트림의 일부 요소를 건너뜀
limit( ) : 스트림의 일부 요소만 추출함 (요소 개수)
peek( ) : 요소를 순회하며 특정 작업 수행함. forEach()와 달리 중간연산자이므로 여러번 사용 가능
List<String> ids = Arrays.asList("John", "Peter", "Park", "Rachel", "John");
ids.stream()
.distinct() // 중복 제거 -> John 제거
.filter(m -> m.startsWith("P")) // P로 시작하는 요소만 필터링
.sorted() // 기본정렬순(오름차순)으로 정렬
.map(m -> m.toUpperCase()) // 요소들을 대문자로 변환
.forEach(System.out::println); // 요소를 순환하면서 출력
//출력값
PARK
PETER
스트림의 최종연산
스트림의 마지막 단계는 최종연산(Terminal Operation)임
최종연산이 수행되고나면 해당 스트림은 닫히고 모든 연산이 종료됨
- 기본집계 : count( ), max( ), min( ), sum( ), average( ) 가 있으며 각 메서드별 반환 타입에 유의. Optional 타입을 다시 기본형으로 변환하기 위해서는 get( )을 사용해야함.
- 매칭 : allMatch( ), anyMatch( ), noneMatch( ) 조건식 람다 Predicate를 매개변수로 하여 특정 조건을 만족하는지 반환
- 요소 소모 : reduce( ) 스트림의 요소를 줄여나가면서 연산을 수행하고 최종 결과를 반환함
reduec( )의 경우 첫번째와 두번째 요소를 가지고 연산을 수행하고, 이후 그 다음 요소를 가지고 연산을 계속 반복함.
따라서 매개변수 타입은 BinarayOperator<T>로 정의되어있음. - 요소 수집 : collect( ) 가공 후 요소를 List, Map, Set 다른 타입의 결과로 수집할 수 있음
Collectors 인터페이스 타입의 인자를 받아서 처리할 수 있음 ex. .collect(Collectors.toList())
그룹핑 / collect(Collectors.groupingBy(조건식), 결과는 map 형태로 나옴. key : value 형태
분할 / collect(Collectors.partitioningBy(조건식), 결과는 이분할 map 형태로 나옴. key(true/false) : value 형태
이제 Section1 의 과정이 거의 끝나가고있다.
이때까지 비교적 쉽게 이해할 수 있었던것에 반해 어제 내용은 쉽게 와닿지 않았고, 그래서 스스로 위기감을 느꼈던 날이었다.
그래도 오히려 이번 기회를 통해 내 실제 공부 시간과 학습 방식, 학습 내용에 대해 성찰해볼 수 있었다.
교재 내용을 따라가는데 집중한 나머지 연습이 부족했고, 그래서 막상 실제로 활용하려고하면 어떤 기능을 써야할지 생각이 나지 않았다.
프로그래밍 공부는 물론 이론도 중요하지만 계속해서 실습해보는것이 중요한 것 같다.
우선 오늘까지 이론 과정을 어느정도 다시 복습하고 내일부터는 이때까지 배운 내용들을 다양하게 활용해서 실습하는 연습을 해야겠다.
'부트캠프 개발일기 > Java' 카테고리의 다른 글
19일차: 파일입출력(InputStream, OutputStream), 스레드(Thread) (0) | 2023.03.10 |
---|---|
17일차: Java 심화(Annotation, Lambda) (0) | 2023.03.08 |
16일차: 컬렉션(Collection Framework) (0) | 2023.03.07 |
15일차: 컬렉션(Enum, Generic, Exception Handling) (0) | 2023.03.06 |
14일차: 미니 프로젝트(의존성 주입) (0) | 2023.03.03 |