JAVA 자바 웹 개발 Day15 (Note): 스트림, enum
2022/2/25
스트림
자바 8부터 추가된 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 ‘반복자’이다.
1. 반복자 스트림
(기존에 썼던 Iterator와 같이 반복자 스트림도 비슷한 계열의 반복자이다.) 자바 7 이전까지는 Iterator 반복자 사용하여 컬렉션 요소를 순차 처리함. 이제는 Stream 이용도 가능.
2. 스트림의 특징
Stream은 Iterator와 비슷한 역할을 하는 반복자이지만, 람다식으로 요소 처리 코드를 제공하는 점과 내부 반복자를 사용하므로 병렬 처리가 쉽다는 점, 중간 처리와 최종 처리 작업을 수행하는 점에서 많은 차이를 가지고 있다.
(Iterator는 그냥 반복을 하는 건데, 스트림을 사용하면 forEach를 사용하여 반복도 할 수 있고 병렬 처리로 동시에 누적합계나 맥스를 구한다던지.. 할 수 있다..)
외부 반복자(external iterator)란 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드 패턴을 말한다. (인덱스를 이용하는 for문, while문, 이터레이터)
내부 반복자 (internal iterator)는 컬렉션 내부에서 요소들을 반복시키고, 개발자는 요소 당 처리해야 할 코드만 제공하는 코드 패턴을 말한다.
병렬 처리 하나의 작업을 서브 작업으로 나눠서 내부에서 일을 분배받아서 처리한 다음에 마지막에 취합해서 주는 거. 난 돌릴게 넌 합하고 넌 평균 내고.. 나중에 최종 결합..
스트림은 중간 처리와 최종 처리를 할 수 있다. 중간 처리에서는 매핑, 필터링, 정렬을 수행하고 최종 처리에서는 반복, 카운팅, 평균, 총합 등 집계 처리를 수행한다.
스트림의 종류
java.util.stream 패키지에 Stream API들이 들어있다.
BaseSream: 얘는 인터페이스..
– Stream
– DoubleStream
– IntStream
– LongStream
1. 컬렉션으로부터 스트림 얻기
컬렉션 변수. stream()
2. 배열로부터 스트림 얻기
Arrays.stream(배열)
3. 숫자 범위로부터 스트림 얻기
IntStream.raner(int start, int endExclusive)
IntStream.rangeClosed(int start, int endInclusive)
스트림 파이프 라인
다량의 데이터를 가공해서 축소하는 것을 일반적으로 리덕션이라고 하는데, 데이터의 합계, 평균값, 카운팅, 최댓값, 최솟값 등이 대표적인 리덕션의 결과물이라고 볼 수 있다.
컬렉션의 요소를 리덕션의 결과물로 바로 집계할 수 없을 경우 필터링, 매핑, 정렬, 그룹핑 등 중간 처리가 필요하다.
중간처리와 최종 처리를 파이프 라인으로 해결한다.
파이프 라인은 여러 개의 스트림이 연결되어 있는 구조를 말한다.
최종 처리가 시작되기 전까지 중간처리는 좀 지연이 된다.. 최종 처리가 시작되면 컬렉션의 요소가 하나씩 중간처리에서 처리가 되고 순차적으로 최종 처리 완료.
필터링 distinct(), filter()
중간처리 기능으로 요소를 걸러내는 역할
1. distinct(): 중복 제거. 동일객체인지 오브젝트에 있는 equals 가지고 비교를 함.
2. filter(Predicate/IntePredicate/Long../Double…): 조건 필터링 (predicate한테 조건을 주겠다..) 변수 -> {true/false로 리턴}
매핑 flapMapXXX(), mapXXX(), asXXXStream(), boxed()
중간처리 기능으로 스트림의 요소를 다른 요소로 대체하는 작업을 함.
1. flapMapXXX(): 요소를 대체해주는 여러 개의 요소들로 구성된 새로운 스트림을 리턴함. 다대다 (대체할게 여러 개)
2. mapXXX(): 요소를 대체해주는 요소로 구성된 새로운 스트림을 리턴함. 일대일
3. asXXXStream(), boxed()
asDoubleStream(): IntStream의 int, LongStream의 long 요소를 double로 변환해 DoubleStream으로 생성해줌
asLongStream(): Intstream의 int를 long으로 변환해 LongStream으로 생성
boxed(): int, long, double을 wrapper 클래스 요소로 박싱 해서 Stream으로 생성
정렬 sorted()
최종 처리 전에 중간 단계에서 요소를 정렬해 최종 처리해주어야 할 경우
요소가 객체일 경우에는 Comparable을 구현하지 않은 객체일 때 예외 발생
sorted()는 Comparble을 구현한 요소에서만 사용 가능.
루프 peek(), forEach()
루핑은 요소 전체를 반복하는 것.
peek(): 중간처리 메서드 (중간에서 반복 돌릴 때)
forEach(): 최종 처리 메서드 (최종에서 반복 돌릴 때)
매칭 allMatch(), anyMatch(), noneMatch()
최종 처리 단계에서 요소들이 특정 조건에 만족하는지 조사할 수 있도록 세 가지 매칭 메서드 제공
기본 집계 sum(), count(), average(), max(), min()
집계는 최종 처리 기능, 처리한 후 하나의 값으로 산출해줌
- Optional 클래스
단순히 집계 값만 저장하는 것이 아니라, 집계 값이 존재하지 않는 경우 디폴트 값을 설정할 수도 있고, 집계 값이 처리하는 Consumer도 등록할 수 있다.
커스텀 집계 reduce()
기본 집계 이외에 커스텀으로 다양한 집계 결과물을 만들 수 있도록 제공해주는 메서드
수집 collect()
스트림은 요소들을 필터링 또는 매핑한 후 요소들을 수집하는 최종 처리 메서드인 collect()를 제공한다. 필요한 요소만 컬렉션으로 담을 수 있고, 요소들을 그룹핑한 후 집계할 수 있다.
1. 필터링한 요소 수집
collect(Collector <T, A, R> collector) 메서드는 필터링 또는 매핑된 새로운 컬렉션에 수집하고, 이 컬렉션을 리턴
T 요소 데이터 하나/ A acumalator? 누적기/ R 요소가 저장될 데이터의 타입 T 타입의 데이터에 A 누적기를 통해 R 타입에 저장하겠다..
Collector의 구현 객체는 Collectors 클래스의 클래스 메서드(static) 메서드를 이용하여 얻을 수 있다.
2. 사용자 정의 컨테이너에 수집
사용자 정의한 컨테이너에 객체에 수집하는 방법
3. 그룹핑해서 수집
collect() 호출 시 Collectors의 groupingBy() / groupingByConcurrent()로 받은 Collector를 매개 값으로 대입하면 그룹핑 가능
4. 그룹핑 후 매핑 및 집계
enum 열거형
서로 연관된 상수들의 집합.
-열거체를 비교할 때 실제 값뿐만 아니라 타입까지도 체크
-열거체의 상수 값이 재정의 되어도 다시 컴파일할 필요 없음
-코드도 단순해지고 가독성도 좋다
1. 열거형 정의
enum 열거 형 이름 {상수 명, 상수 명, ……} //열거 형 이름도 클래스처럼 첫 글자 대문자
enum 열거 형 이름 {상수 명(1), 상수 명(10), …… }//원하면 상수 값 지정 가능
열거 형 상수 간의 비교: == 로 비교.
compareTo(): 같으면 0 왼쪽이 크면 양수, 오른쪽이 크면 음수
< > 크다 작다는 사용 불가.
int a = 열거형 이름. 상수명;
--
어제부터 내용이 너무 어려워서 따라가질 못하겠다^^... 당황스러우니까 자꾸 헛웃음이 나대.. 열심히 타이핑하긴 했으나 원리를 이해하진 못한 상태.. 그래.. 이건 심화 부분이라고 했는데 어떻게 배운지 15일 만에 이해할 수 있겠어...... 따로 더 공부를 하자..