스트림(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
'✨ Java > etc' 카테고리의 다른 글
자바(JAVA) - 기본형(Primitive) VS 참조형(Reference) (0) | 2024.02.16 |
---|---|
자바(JAVA) - String, StringBuffer, StringBuilder 각 성능차이 (0) | 2023.07.24 |
자바(JAVA) - 직렬화(Serialization) (0) | 2023.07.24 |
자바(JAVA) - ByteArrayInputStream과 ByteArrayOutputStream (0) | 2023.07.24 |
자바(JAVA) - equals와 '==' 차이 (0) | 2023.07.20 |
댓글