JAVA Stream 소개

강정우·2022년 11월 17일
0

JAVA

목록 보기
25/31
post-thumbnail

1. Stream이란?

  • 다양한 데이터 소스( 컬렉션, 배열 )를 표준화된 방법으로 다루기 위한 것.
    즉, 컬렉션 데이터 타입( List, Set, Map ), 배열 모두 Stream 으로 n번 중간연산이 가능하고 1번 최종 연산이 가능하다.

  • 스트립 생성과정

    1. 스트림 만들기
    2. 중간연산 (0 ~ n번)
    3. 최종연산 (0 ~ 1번)

1) 스트림 만들기 예제

Lisst<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::random);
IntStream intStream = new Random().ints(5); // 크기가 5인 난수 스트림 

2) 중간연산과 최종연산

  • 중간연산 - 연산결과가 스트림 그 자체인 연산
  • 최종연산 - 연산결과가 스트림이 아닌! 연산 (스트림의 요소를 소모)
stream.distinct().limit(5).sorted().forEach(System.out::pringln)
String[] strArr = {"dd","aaa","CC","cc","b"};
Stream<String> stream = stream.of(strArr);  // 문자열 배열이 소스인 스트림
Stream<String> filteredStream = stream.filter(); // 걸러내는 중간연산
Stream<String> distinctedStream = stream.distinct(); // 중복제거 중간연산
int total = stream.count(); // 요소 개수 세기 최종연산

3) 특징

  • 원본을 변경하지 않는다. 데이터 소스로부터 데이터를 읽기만 할 뿐이다.
  • lterator처럼 일회용이다. 필요하면 다시 스트림을 생성해야한다.
strStream.forEach(System.out::pringln); // 모든 요소를 화면에 출력하는 최종연산 => 요소가 남아있지 않음
int numOfStr = strStream.count(); // => error 왜? 스트림이 이미 닫혔거든
  • 최종연산 전까지 중간연산이 수행되지 않는다. => 지연된 연산
IntStream intStream = new Random().ints(1,46); // 1 ~ 45 범위의 무한 스트림
intStream.idstinct().limit().sorted() // 중간연산
		 .forEach(i->System.out.print(i+",")); // 최종연산
  • 스트림 작업을 내부 반복으로 처리한다. 단 .forEach문은 최종연산임.
  • 멀티쓰레드로 스트림의 작업을 병렬로 처리 => 병렬 스트림 .parallel() / default는 .sequentail()
  • 기본형 스트림 => IntStream, LongStream, DoubleStream
    • 주로 데이터 소스가 기본형 일때 쓴다.
    • 오토박싱 & 언박싱의 비효율이 제거됨(Stream<Inreger>대신 IntStream 사용)
    • 숫자와 관련된 유용한 메서드를 Stream<T>보다 더 많이 제공
profile
智(지)! 德(덕)! 體(체)!

0개의 댓글