티스토리 뷰
반응형
자바의 정석 - 기초편 ch14-15,16 스트림, 스트림의 특징
14-15 스트림(Stream)
스트림이란? 다양한 데이터 소스를 Collection Framework인 List, Set, Map과 배열을 표준화된 방법으로 다루기 위한 것이다.
스트림은 아래와 같이 연산을 거친다.
- 중간연산 - 연산결과가 스트림인 연산. 반복적으로 적용 가능하다.
- 최종연산 - 연산결과가 스트림이 아닌연산으로 단 한번만 적용 가능하다.
스트림의 요소를 소모한다.
예제1 : Steam으로 변환하기 예제
// 1. 컬렉션
List<Integer> list = Arrays.asList(1,2,3,4,5);
Stream<Integer> intStream = list.stream();
// 2. 배열
Stream<String> strStream = Stream.of(new String[] {"a", "b", "c"});
// 3. 람다식
Stream<Integer> evenStream = Stream.interator(0, n->n+2); //0, 2, 4, 6...
Stream<Double> randomStream = Stream.generate(Math::random);
IntStream intStream = new Random().ints(5); //난수 스트림 크기가 5
예제2 스트림 사용 -1
stream.distinct().limit(5).sorted().forEach(System.out::print);
// ----------중간연산----------- -----최종연산 스트림 소모------
- distinct() 중복제거
- limit(5) 5개 자르기
- sorted() 정렬
예제2 스트림 사용 -2
String[] strArr = {"dd", "aaa", "CC", "cc", "b"};
Stream<String> stream = Stream.of(strArr); // 1.문자열 배열이 소스인 스트림
Stream<String> streamColculate = stream.filter().distinct().sort().limit(5); // 중간연산
int total = stream.count(); // 최종연산
14-15,16 스트림(Stream)의 특징(1/3)
- 스트림은 데이터 소스로부터 데이터를 읽기만할 뿐 변경하지 않는다.
List<Integer> list = Arrays.asList(3,1,2,5,6,2);
// list를 정렬해서 새로운 List에 저장한다.
List<Integer> sortedList = list.stream().sorted().collect(Collectors.toList());
// list 요소들은 변하지않는다.
System.out.println(list); // [3, 1, 2, 5, 6, 2]
System.out.println(sortedList); // [1, 2, 2, 5, 6]
- 스트림은 Iterator처럼 일회용이다.(필요하면 다시 스트림을 생성해야한다.)
strStream..forEach(System.out::println); //모든 요소를 화면에 출력(최종연산)
int totalCnt = stream.count(); // Error! 스트림이 위에서 소진되고 닫혔다.
- 최종연산 전까지 중간연산이 수행되지 않는다.
- 이는 최종연산이 있을 때 중간연산이 수행되는것으로써
아래 무한스트림이 distinct() 즉, 중복제거를 하는게 말이 안되지만
최종 연산을 만나고 중간연산인 중복제거를 함으로써 연산을 지연시켜 실행한다. -
IntStream intStream = new Random().ints(1, 46); // 1~45범위의 무한 스트림 intStream.distinct().limit(6).sorted() .forEach(i->System.out.print(i+",")); // 최종연산
- 이는 최종연산이 있을 때 중간연산이 수행되는것으로써
14-15,16 스트림(Stream)의 특징(2/3)
- 스트림은 작업을 내부 반복으로 처리한다.
- 아래 코드를
for(String str : strList) System.out.println(str);
- 다음과 같이 간결하게 바꾼다. (forEach 는 스트림 최종연산이다,)
stream.forEach(System.out::println);
- 위 내부적인 소스는 아래와 같다,
비록 풀어서 쓴것보단 효율성은 떨어지지만 코드가 간결해진다.void forEach(Consumer<? super T> action){ Objects.requireNonNull(action); //매개변수의 널체크 for(T t: src) //내부 반복 (for문을 메서드 안으로 넣음) action.accept(T); }
14-15,16 스트림(Stream)의 특징(3/3)
- 스트림의 작업을 병렬로 처리해준당 - 병렬스트림
- parallel()을 사용하면 병렬처리 스트림으로 바뀌기게 속도가 빨라진다.
Stream<String> strStream = Stream.of("dd", "aa","CC", "cc", "b"); int sum = strStream.parallel() .mapToInt(s->s.length()).sum(); //모든 문자ㅏ열의 길이의 합
- 기본형 스트림 - IntStream, LongStream, DoubleStream
- 오토박싱&언방식의 비효율이 제거된다.
- Stream 을 사용할경우 오토박싱, 언박싱 하여 연산하는데
IntStream을 사용하면 오토박싱, 언박싱을 안해도된다.
- Stream 을 사용할경우 오토박싱, 언박싱 하여 연산하는데
- 숫자와 관련된 유용한 메서드들을 Stream 보다 더 많이 제공한다.
- Stream는 어떤 T dataType가 올 지 모르기 때문이다
- 오토박싱&언방식의 비효율이 제거된다.
참조 )
[자바의 정석 - 기초편] ch14-15,16 스트림, 스트림의 특징
https://www.youtube.com/watch?v=7Kyf4mMjbTQ
반응형
'java_basic' 카테고리의 다른 글
Lambda 기초5 최종연산 reduce (0) | 2022.02.16 |
---|---|
Lambda 기초4 중간연산2 (0) | 2022.02.16 |
Lambda 기초4 중간연산1 (2) | 2022.02.14 |
Lambda 기초3 (스트림 중간연산/최종연산 전체 메소드) (0) | 2022.02.01 |
Lambda 기초2 (스트림 생성하기) (0) | 2022.02.01 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- springboot
- vscode
- JPA
- AnnotationConfigApplicationContext
- 람다
- nginx
- 영속성 컨텍스트
- elasticsearch
- BeanFactory
- stream
- ngnix
- java
- NPM
- 중간연산
- lambda
- install
- Vue
- map
- Vuex
- 차이
- container
- MAC
- Intellij
- 최종연산
- 스트림
- docker
- ApplicationContext
- mvn
- 자바8
- webpack
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함