티스토리 뷰

Java

[JAVA] 자바 스트림(Stream)

jonyo 2022. 3. 12. 19:18

스트림이란

스트림이란 다양한 데이터 소스를 표준화 된 방법으로 다루기 위한 방법이다.

자바에는 다양한 Collection Framework가 존재한다.
예를들어 List, Set, Map과 같은 것들이 이에 해당한다. 하지만 이 인터페이스 모두가 각각 성격이 달라 사용방법이 달랐기에 자바8부터 스트림이 등장하였고 이를 통해 표준화된 방법을 제공하고 있다.

List, Set, Map과 같은 데이터 소스로 부터 스트림을 만들 수 있다.
스트림을 만들고 나면 그 이후부터는 표준화된 방식으로 작업을 처리하게 된다.
작업은 N번의 중간연산 과 한번의 최종연산 으로 이루어진다. 즉, 중간작업을 여러번 거쳐 우리가 원하는 데이터(스트림)로 바꾼다음 최종연산을 통해 우리가 원하는 데이터를 얻을 수 있다.

스트림으로 변환하는 방법은 다음과 같다.

Stream<T> Collection.stream()

이 함수를 사용하게 되면 다양한 컬렉션을 스트림으로 변경할 수 있다.

Stream<String> strStream = Stream.of("a", "b", "c");

와 같이 집적적으로 스트림을 생성하는 것 도 가능하다.

결과적으로 스트림을 이용하는 순서는 다음과 같다.

스트림 만들기 -> 중간연산 -> 최종연산

중간연산의 결과는 스트림 이다.
반면에 최종연산은 결과적으로 우리가 얻고자 하는 데이터 값이 된다.

stream.distinct().limit(5).sorted().forEach(System.out::println)
//스트림  중간연산1    중간연산2  중간연산3   최종연산

실제로 이런식으로 사용되게 된다.

스트림은 데이터소스로부터 데이터를 읽기만 할 뿐 직접적으로 변경하지 않기에 원본을 건드리지 않는다. 또한 스트림은 Iterator 와 같이 일회용으로 사용되기에 한번 사용되고 나면 다시 스트림을 생성하여 사용해야 한다.

스트림의 연산

위에 설명했듯 중간연산은 여러번 가능하며, 최종연산은 단 한번만 가능하다. 최종연산을 하면 스트림의 요소를 모두 소모하기에 스트림이 닫히게 되어 다시 사용이 불가능하다.

스트림에서 제공하는 중간연산은 다음과 같다.

distinct() // 중복을제거
filter() // 조건에 안맞는 요소 제외
limit() // 스트림 일부를 잘라낸다
skip() // 스트림의 일부를 건너뛴다
peek() // 스트림의 요소에 작업을 수행한다. (주로 작업 중간 결과를 확인할 때 쓰인다.)
sorted() // 정렬
map(Function),flatMap(Function) // 스트림의 요소를 변환한다

최종연산은 다음과 같다.

forEach() // 각 요소에 지정된 작업을 수행한다.
forEachOrdered() // 병렬 실행일 경우 스트림의 순서를 유지한다.
count() // 개수 반환
max(), min() // 최대/최소를 반환
findAny() // 스트림의 요소중 아무거나 하나를 반환한다.(병렬)
findFirst()// 첫번째요소 반환(직렬)
allMatch(), anyMatch(), noneMatch() //주어진 조건을 모든 요소가 만족시키는지, 아닌지 확인한다.
toArray() //배열로변환한다.
reduce() // 스트림의 요소를 하나씩 줄여가면서 계산한다.
collect() //스트림의 요소를 수집. 주로 결과를 컬렉션에 담아 반환할 때 사용된다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함