728x90
1. 스트림(Stream)
배열, 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자
스트림을 사용하면 List, Set, Map, Array 등 다양한 데이터 소스로부터 스트림을 만들 수 있고, 이를 표준화된 방법으로 다룰 수 있다.
스트림 사용해보기
- for문보다 훨씬 간결하고 가독성이 높다.
파이프라인 구성
여러개의 스트림이 연결되어 있는 구조, 최종연산을 제외하고는 모두 중간 연산 스트림이다.
스트림 생성
stream()을 사용하면 해당 Collection의 객체를 소스로 하는 Stream을 반환한다.
또 배열의 원소들을 소스로 하는 Stream을 생성하기 위해서 Stream의 of 메서드, Arrays의 Stream 메서드를 이용한다.
이 때, 주의할 점은
스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐 변경하지 않는다.
스트림은 일회용 이다.
중간연산
- 필터링(filter(), distinct())
- filter() : Stream에서 조건에 맞는 데이터만 필터하여 더 작은 컬렉션을 만든다. filter() 메서드에는 매개값으로 조건이 주어지고, 조건이 참이되는 요소만 걸러낸다.
- distincct() : Stream의 요소들에 중복된 데이터가 존개하는 경우, 중복을 제거하기 위해 사용한다.
- 매핑(map())
- map() : 기존의 Stream 요소들을 대체하는 요소로 구성된 새로운 Stream을 형성하는 연산(변환한다는 뜻.)
- mapToInt(), mapToLong(), mapToDouble() 등의 메서드가 있다.
- flatMap() : flatMap은 요소를 대체하는 복수 개의 요소들로 구정된 새로운 스트림을 리턴한다.
- 정렬(sorted())
- sorted() : Stream 요소들을 정렬해야 할 때 사용한다. Comparator 인자 없이 호출할 경우에는 오름차순으로 정렬이 되며, 내림차순으로 정렬하기 위해서는 Comparator의 reverseOrder를 이용한다.
- 연산 결과 확인(peek())
- peek() : 요소를 하나씩 돌면서 출력한다. 연산 중간 메서드 이다.(디버깅할 때 주로 사용한다.)
최종연산
- 연산 결과 확인(forEach())
- forEach() : 파이프라인 마지막에서 요소를 하나씩 연산한다.
- 매칭(match())
- match() : Stream 요소들이 특정한 조건을 충족하는지 검사한다.
- allMatch() : 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하는지 조사
- anyMatch() : 최소한 한 개의 요소가 매개값으로 주어진 Predicate의 조건을 만족하는지 조사
- noneMatch() : 모든요소들이 매개값으로 주어진 Predicate의 조건을 만족하지 않는지 조사
- 기본 집계(sum(), count(), average(), max(), min())
- 요소들을 카운팅, 합계, 평균값, 최대값, 최소값 등으로 연산하여 하나의 값으로 산출하는 것을 의미
- 응축(reduce())
- reduce() : 누적하여 하나로 응축하는 방식으로 동작, 최대 3개의 매개변수를 받을 수 있다.
1. Accumulator : 각 요소를 계산한 중간 결과를 생성하기 위해 사용
2. Identity : 계산을 수행하기 위한 초기값
3. Combiner : 병렬 스트림에서 나누어 계산된 결과를 하나로 합치기 위한 로직
- 수집(collect())
- collect() : Stream의 요소들을 List나 Set, Map, 등 다른 종류의 결과로 수집하고 싶은 경우 사용
Optional<T>
모든 타입의 객체를 담을 수 있는 래퍼 클래스이다.
1. Optional 객체를 생성하려면 of(), ofNullable()을 사용한다. 참조변수 값이 null일 가능성이 있다면 ofNullable()을 사용한다.
2. Optional 타입의 참조변수를 기본값으로 초기화하려면 empty() 메서드를 사용한다.
3. Optional 객체에 저장된 값을 가져오려면 get() 메서드를 사용한다.
4. 참조변수의 값이 null일 가능성이 있다면 orElse() 메서드를 사용해 디폴트 값을 수정할 수 있다.
2. 스트림 요약!
- 선언형 프로그래밍 방식이다.
- 원본을 변경하지 않는다. (읽기전용 느낌)
- 일회용이다. (최종연산이 끝나면 뒤로 이어지지 않는다.)
- 병렬 스트림 사용이 가능하다.(내부 반복자 사용)
'JAVA' 카테고리의 다른 글
[JAVA]재귀함수 (0) | 2022.11.30 |
---|---|
[JAVA]람다(Lambda) (0) | 2022.11.30 |
[JAVA]애너테이션(Annotation) (0) | 2022.11.30 |
[JAVA]예외 처리(Exception Handling)과 컬렉션 프레임워크(Collection Framework) (0) | 2022.11.30 |
[JAVA]열거형(Enum), 제네릭(Generic) + 래퍼클래스(Wrapper Class) (0) | 2022.11.30 |