본문 바로가기
✨ Java/etc

자바(JAVA) - 스트림(Stream)

by 환풍 2024. 2. 21.
728x90

 

 

 

스트림(Stream)은 한 번 사용되거나 닫힌 후에는 재사용할 수 없다.

일회성이기 때문에 닫힌 후에 다시 사용하려고 하면 IllegalStateException이 발생된다.

따라서 스트림에서 요소를 여러 번 사용하려면, 스트림을 다시 생성하거나 요소를 컬렉션에 수집한 후 해당 컬렉션을 사용해야 한다.

 

스트림을 사용하기 위해서는 컬렉션 또는 배열을 먼저 만들어줘야한다.

 

컬렉션( List, Set, Collection ) Stream

 

리스트를 생성해서 Stream에 리스트의 값을 넣고, .forEach( ) 메소드를 통해 하나씩 출력해보았다.

 

 

 

 

배열 ( Array ) Stream

 

배열을 생성해서 Stream에 배열의 값을 넣고, .forEach( ) 메소드를 통해 하나씩 출력해보는 코드이다.

 

 

Stream.filter( )

스트림 내 요소들을 하나씩 조건에 맞춰 걸러내는 작업이다. 

 

여기에서 collect 메소드의 Collectors.toList( ) 메소드는 스트림에서 작업한 결과를 담은 리스트로 반환하는 것이다.

 

Stream.builder( )

빌더(Builder)를 사용하면 스트림에 직접적으로 원하는 값을 넣을 수 있다. 마지막에 build 메소드로 스트림을 리턴한다.

 

왼쪽과 같이 결과가 뜨게 된다.

1 2 3은 Stream을 정수형으로 하나씩 추가해 마지막에 .build( ) 메소드를 통해 뽑아낸 값이다.

String으로 뽑아낸 builderString은 하나씩 추출하기 위해 먼저 배열로 데이터를 옮긴 후 뽑아내었다.

 

 

 

stream.map( )

맵은 스트림 내 요소들을 하나씩 특정 값으로 변환해준다.

 

현재 코드에서는 대문자로 변환한 값들을 출력하도록 map( ) 을 써서 코드를 만들었다.

 

 

 

 

stream.sort( )

정렬기능이다.

 

 

sorted( ) 만하고 끝내면, a - z 순으로 정렬을 수행한다.

 

 

Comparator.reverseOrder()

 

코드를 추가하게 되면, z - a 순인 역정렬을 수행한다.

 

 

steam.collect( )

종료 작업 메소드이다. 

 

 

steam.findFirst( )

fiter 조건에 일치하는 element 1개를 Optional로 리턴한다. 조건에 일치하는 요소가 없으면 empty가 리턴된다.

 

findAny( ) 와 비슷한데, 얘는 Stream에서 가장 먼저 탐색되는 요소를 리턴하지만,

findFirst( ) 는 조건에 일치하는 요소 중 Stream에서 순서가 가장 앞에 있는 요소를 리턴한다.


연산

 

스트림(Stream)을 사용하는 이유

  • 간결하고 가독성이 높은 코드
    : 스트림은 간결하고 함수적인 스타일의 코드를 작성할 수 있도록 도와줍니다. 루프와 조건문의 복잡성을 줄여주고, 코드의 의도를 더 명확하게 표현할 수 있습니다.

  • 병렬 처리 지원
    : 스트림은 병렬 처리를 지원하므로 멀티코어 프로세서의 장점을 활용하여 데이터 처리 성능을 향상시킬 수 있습니다. 병렬 스트림을 사용하여 데이터 처리 작업을 분할하고 병렬로 처리할 수 있습니다.

  • 유연성
    : 스트림은 다양한 데이터 소스를 처리할 수 있습니다. 컬렉션, 배열, 파일, I/O 등 다양한 소스에서 스트림을 생성하고 처리할 수 있습니다.

  • 함수형 프로그래밍 지원
    : 스트림은 함수형 인터페이스와 람다 표현식을 사용하여 데이터를 처리할 수 있습니다. 이를 통해 함수형 프로그래밍의 장점을 활용할 수 있습니다.

  • 중간 및 최종 연산의 분리
    : 스트림은 중간 연산과 최종 연산을 분리하여 데이터 처리 파이프라인을 구성할 수 있습니다. 이를 통해 더 유연하고 재사용 가능한 코드를 작성할 수 있습니다.

  • 스트림 파이프라인
    : 스트림은 여러 연산을 연결하여 파이프라인을 구성할 수 있습니다. 이를 통해 데이터 처리 작업을 단계별로 구성하고 관리할 수 있습니다.

 

Stream의 종류

 Stream <T>  범용 Stream 
 IntStream  값 타입이 Int인 Stream
 LongStream  값 타입이 Long인 Stream
 DoubleStream  값 타입이 Double인 Stream

 

Stream의 중간 연산 명령어

 Stream < T > distinct()  Stream의 요소 중복 제거
 Stream < T > sorted()   Stream 요소 정렬
 Stream < T > filter(Predicate < T > predicate)  조건에 충족하는 요소를 Stream으로 생성
 Stream < T > limit(long maxSize)  maxSize 까지의 요소를 Stream으로 생성
 Stream < T > skip(ling n)  처음 n개의 요소를 제외하는 stream 생성
 Stream < T > peek(Consumer< T > action)  T타입 요소에 맞는 작업 수행
 Stream < R > flatMap(Function< T, stream<? extends R>> Tmapper)  T타입 요소를 1:N의 R타입 요소로 변환하여 스트림 생성
 Stream < R > map(Function<? super T, ? extends R> mapper)  입력 T타입을 R타입 요소로 변환한 스트림 생성
 Stream mapToInt(),mapToLong(),mapToDobule()  만약 map Type이 숫자가 아닌 경우 변환하여 사용



Stream의 최종 연산 명령어

 void forEach(Consumer <? super T> action)  Stream 의 각 요소에 지정된 작업 수행
 long count()  Stream 의 요소 개수
 Optional < T > sum (Comparator <? super T> comparator)  Stream 의 요소 합
 Optional < T > max (Comparator <? super T> comparator)  Stream 요소의 최대 값
 Optional < T > min (Comparator <? super T> comparator)  Stream 요소의 최소 값
 Optional < T > findAny()  Stream 요소의 랜덤 요소
 Optional < T > findFirst()  Stream 의 첫 번째 요소
 boolean allMatch(Pradicate < T > p)  Stream 의 값이 모두 만족하는지 boolean 반환
 boolean anyMatch(Pradicate < T > p)  Stream 의 값이 하나라도 만족하는지 boolean 반환
 boolean noneMatch(Pradicate < T > p)  Stream 의 값이 하나라도 만족하지않는지 boolean 반환 
 Object[] toArray()  Stream 의 모든 요소를 배열로 반환

 

 

출처

https://khj93.tistory.com/entry/JAVA-%EB%9E%8C%EB%8B%A4%EC%8B%9DRambda%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%82%AC%EC%9A%A9%EB%B2%95
반응형

댓글