Java 8부터 도입된 Stream API는 컬렉션(List,Set 등)이나 배열을 선언형(함수형) 스타일로 처리할 수 있도록 도와준다. 반복문보다 간결하고 가독성이 좋다.
중간연산
- 스트림을 가공하거나 필터링하는 과정, 결과를 즉시 반환하지 않고 최종 연산이 실행되기 전까지는 동작하지 않는다.
- mpa(Function) : 각 요소를 다른 값으로 변환할 때 사용함. 예를 들어 숫자리스트에서 각각의 숫자를 2배로 만들고 싶을때
- filter(Predicate) : 특정 조건에 맞는 요소만 남기고 나머지는 제거함
- distinct() : 중복된 요소를 제거함 equals()와 hashCode()기준으로 판단한다
- sorted() : 기본 오름차순으로 정렬 내림차순 등 사용자 지정 정렬을 원한다면 sorted(Comparator.reverseOrder())
- limit() : 스트림의 앞에서부터 n개의 요소만 추출한다
- skip() : 스트림의 앞에서부터 n개의 요소를 건너뛴다.
- peek() : 요소를 가공하지 않고 단순히 확인하거나 출력할 때 사용하고 주로 디버깅시 사용함
최종연산
- 스트림을 순회하며 실제로 결과를 만들거나 출력한다. 이 시점에서 스트림이 소비된다.
- forEach() : 각 요소에 대해 특정 작업을 수행한다. 가장 간단한 반복문 대체용으로 사용됨
- collect(Collectors.toList()) : 스트림의 결과를 리스트로 모을 때 사용한다. toSet(), toMap() 등도 존재
- toArray() : 스트림을 배열로 변환할때 사용. 보통 기본형 배열로 변환하려면 mapToInt(a -> a).toArray(); 이런식으로 사용
- reduce() : 누적 연산에 사용. 합계, 곱, 문자열 연결 등 다양한 방식으로 사용가능. 초기값이 있을때 초기값, (a,b) -> a+b, 초기값이 없을때는 Optional 로 감싸지게 됨. getAsInt() 등을 활용하여 꺼내서 출력해야 한다.
- count() : 요소의 개수를 반환한다.
- anyMatch, allMatch, noneMatch : 조건에 따라 만족하는 여부를 확인
- findFirst(), findAny() : 첫번째 요소나 아무 요소 하나를 반환한다. 반환 타입은 Optional임 result.orElse("기본값") 등 -> 값이 없을 수도 있어서 .isPresent(), .orElse(), .ifPresent() 등을 통해 안전하게 처리
기본형 스트림 전용 함수
- 성능 최적화를 위해 int, long, double 과 같은 기본형을 위한 스트림도 존재
- mapToInt() : 객체 스트림을 intStream으로 변환. 이후 sum(), average(), ,max() 등을 사용가능
- sum() : 합계
- average() : 평균
- min(), max() : 최소,최대값
map()은 결과를 새로운 스트림으로 변환, forEach()는 데이터를 사용하고 끝내는 용도 -> 결과를 모으지않고 단순 출력 저장등