Stream(스트림)
▶다양한 데이터 소스를 표준화된 방법으로 다루기 위한 도구
List<Integer> list = Arrays.asList(1,2,3,4,5);
Stream<Integer> intStream = list.stream(); //컬렉션
Stream<String> strStream = stream.of(new String[]{"a", "b", "c"}); //배열
Stream<Integer> evenStream = Stream.iterate(0, n->n+2); //람다식
Stream<Double> randomStream = Stream.generate(Math::random0; //메서드참조
IntStream intStream = new Random().ints(5); //난수 스트림(크기가 5)
Stream(스트림)의 특징
▶스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐 변경하지 않는다.
List<Integer> list = Arrays.asList(3,1,5,4,2);
List<Integer> sortedList = list.Stream().sorted(). //list를 정렬해서
collect(Collectors.toList()); //새로운 List에 저장
System.out.println(list); //[3, 1, 5, 4, 2]
System.out.println(sortedList); //[1, 2, 3, 4, 5]
▶스트림은 Iterator처럼 일회용이다.(필요하면 다시 스트림을 생성하여야 함)
strStream.forEach(System.out::println); //모든 요소를 화면에 출력, forEach() ->최종연산
int numOfStr = strStream.count(); //에러. 스트림이 이미 닫혔음
▶지연된 연산 - 최종 연산 전까지 중간연산이 수행되지 않는다.
IntStream intStream = new Random().inits(1, 46); //1~45범위의 무한 스트림
intStream.distinct().limit(6).sorted() //중간연산
.forEach(i->System.out.print(i+",")); //최종연산
→무한스트림에서 중복을 제거하고, 갯수를 제한을 하고, 정렬을 하는 것은 이론상 불가능하다.
그러나 이러한 중간 연산이 가능한 이유는 Stream처리를 바로 하지 않고, 일단 중간연산을 체크만 해놓고,
나중에 최종연산을 할 때 중간연산이 이루어지기 때문이다.
이러한 메커니즘을 "지연된 연산"이라고 한다.
▶스트림은 작업을 내부 반복으로 처리 한다.
for(String str : strList)
System.out.println(str);
↓ ↓
Stream.forEach(System.out::println);
void forEach(Comsumer<? super T> action) {
Objects.requireNonNull(action); //매개변수의 널 체크
for(T t : src) //내부 반복(for문을 forEach메서드 안으로 넣음)
action.accept(T);
}
▶스트림은 작업을 내부 반복으로 처리 한다.
Stream<String> strStream = Stream.of("dd", "aaa", "cc", "cc" 'b");
int sum = strStream.parallel() //병렬 스트림으로 전환(속성만 변경)
mapToInt(s-> s.length()).sum(); //모든 문자열의 길이의 합
▶기본형 스트림 - IntStream, LongStream, DoubleStream
Stream<Integer>대신 IntStream을 사용하므로써 오토박싱&언박싱의 비효율이 제거됨
IntStream, LongSteam, DoubleSteam은 숫자와 관련된 유용한 메서드를 많이 제공한다.
'자바 > Java (중요하고, 이해 안 되고, 어려운)' 카테고리의 다른 글
Optional <T> (0) | 2022.10.30 |
---|---|
메서드 참조 (0) | 2022.10.30 |
람다 Lambda (0) | 2022.10.30 |
Comparable (0) | 2022.10.27 |
생성자 (0) | 2022.10.26 |