Stream
: 데이터 소스가 무엇이든 간에 같은 방식을 다룰 수 있게 데이터를 추상화하고 데이터를 다루는 메서드를 정의해 놓음
배열, 컬렉션 등 stream 객체로 변환하면 동일한 방식으로 처리 가능
-편의 기능
스트림은 데이터 소스를 변경하지 않는다.
스트림은 일회용
스트림은 작업을 내부 반복으로 처리
1) 컬렉션
Collection
-> Stream stream()
스트림은 List, Set 구현객체만 생성가능
일반 스트림만 생성 가능: Stream<E>
2) 배열
Arrays
-> static stream(....)
3) 일반 : IntStream, DoubleStream,
Stream
-> .of(T... )
1) 중간연산
- 스트림 중간 부분에 정의된 메서드
- 반환값이 Stream인 형태
- 최종 연산이 호출 될떄 까지는 연산 X
2) 최종연산
- 가장 끝에 추가된 메서드
- 반환값이 Stream이 아닌 형태
3) 지연된연산
중간 연산은 최종 연산이 호출되어야 스트림을 소비하면서 연산이 진행 된다.
3. 기본자료형을 다루는 스트림
IntStream
LongStream
DoubleStream
-> 오토박싱, 언박싱이 발생 X -> 성능상 이점
-> 숫자 관련 편의 기능 추가(예 - 통계 관련 기능)
일반 스트림 -> 기본 자료형 스트림으로 변환 메서드
mapToInt : IntStream
mapToLong : LongStream
mapToDouble : DoubleStream
기본 자료형 스트림 -> 일반 스트림 변환 메서드
boxed()
예)
IntStream -> Stream<Interger>
LongStream -> Stream<Long>
->
->
스트림 활용
1. 생성하기
Collection::stream() : 일반 스트림
Arrays.stream(...) : 일반스트림 + 기본 자료형 스트림
Stream.of(T.... ) : 일반스트림, 기본 자료형 스트림
1) 특정 범위의 정수
기본 자료형 스트림
- 횟수가 정해진 반복을 할때
range(int s, int e) : s이상 e미만
rangeClosed(int s, int e): s이상 e이하
2) 임의의 수
java.util.Random
무한 스트림 - 갯수 제한이 필요
IntStream ints(); : 정수범위 난수
LongStream longs() :
DoubleStream doubles() : 실수 범위 난수
3) 람다식 - iterate(), generate()
- 무한스트림
4) 두 스트림의 연결 - concat()
limit() : 갯수 제한
skip() : 건너 뛰기
2) filter(), distinct()
filter(Predicate<T> ...) : 스트림을 걸러주는 기능
distinct() : 중복 제거
- 중복 제거 기준 : equals() and hashCode()
3) sorted()
- 정렬 : 기본 정렬 기준 java.lang.Comparable int compareTo(...)
- sorted(Comparator ....)
- 대안적인 기준 : java.util.Comparator :: int compare(....)
4) map()
map(Function<T,R> ...) : 변환 메서드
5) peek()
- forEach와 매개변수가 동일
- Stream peek(Consumer ... ) : 중간 연산 : 중간에 값을 확인할 경우 많이 사용
- void forEach(Consumer ...) : 최종 연산 : 최종적으로 출력할때 사용
6) mapToInt(), mapToLong(), mapToDouble()
목적
: NullPointerException 오류 대책
null에 대한 다양한 처리 방식을 제공하는 클래스
특징
-값이 null인지 아닌지를 체크해보려면 값을가지고 있어야 함
class Optional<T> {
...
private final value;
...
}
-기본형을 처리하는 optional 클래스
-오토박싱, 언박싱 발생 X -> 성능상의 이점
참고) 중간 연산 flatMap : 중첩된 스트림을 -> 일차원적 스트림으로 변환
1)forEach(Consumer<T>) - 반복 작업 수행
2)allMatch(), anyMatch(), nonMatch(), findMatch(), findAny()
boolean allMatch(Predicate ...) : 모든 요소가 조건에 참일때 참
boolean anyMatch(Predicate ...) : 어떤 요소든 조건이 하나라도 참이면 참
boolean nonMatch(Predicate ...) : 전부 거짓일때 참
T findFirst() : 가장 첫번째 스트림의 요소를 반환
long count() : 요소의 갯수 - 일반 스트림(Stream<T>), 기본 자료형 스트림(IntSteram, LongStream, DoubleStream)
기본 자료형 스트림(Int Stream, LongStream, Doublestream)
long sum() : 합계
optionalDOuble averager() 평균
int total = Arrays.stream(scores).reduce(0, (n1, n2) -> n1 + n2);
java.util.stream.Collectors
toList(), toSet(), toMap(), toCollection(), toArray()
-toMap() : 키, 값
-toCollection() : List, Set의 하위 클래스 객체
만약 ArrayList 변환? , HashSet, TreeSet로 변환 이때는 toCollection 사용
joining() : 스트림 요소를 특정 문자로 결합해서 문자열로 생성
groupingby() : 특정 값을 가지고 그룹
partitioningBy() : 양분(참, 거짓)
MapBoolean, List<...>
flatMap : 중간 연산