빠에야는 개발중

스트림 api 본문

공부/JAVA

스트림 api

빠에야좋아 2018. 3. 1. 03:29

자바 8에서 추가된 큰 기능들 중 하나가 스트림 api이다. 스트림을 사용하면 컬렉션의 요소들의 연산을 쉽게 처리할 수 있다는 큰 장점이 있다.


스트림의 특징은 다음과 같다.


1. 스트림은 요소들을 보관하지 않는다. 필요할 때마다 스트림을 생성한다.

2. 스트림은 원본 컬렉션을 변경하지 않는다. 새로운 스트림을 반환할 뿐이다.

3. 스트림은 지연(lazy) 처리된다. 예를 들어 정렬을 수행할 때 도중에 결과값을 반환하게 된다면 전체 연산을 수행하지 않는다.


스트림은 또한 간단하게 병렬 처리를 구현할 수 있다. parallelStream()으로 스트림을 생성하면 스트림 라이브러리가 병렬로 연산을 수행한다.

1
2
long count = words.stream().filter(w -> w.length() > 12).count();
long count = words.parallelStream().filter(w -> w.length() > 12).count();
cs


스트림 API의 3단계

1
collection.스트림 생성().중개 연산().최종 연산() 
cs


1. 스트림을 생성한다.

2. 요소들을 매핑하는 중개 연산을 수행한다.

3. 중개 연산의 결과에서 최종 연산값을 도출해낸다. 이후로는 해당 스트림을 더이상 사용할 수 없다.


스트림의 예시

몇가지 예시를 통해 스트림 API가 어떻게 사용되는지 보자.


1
2
// 스트림의 요소 갯수를 리턴
long count = stream.count();
cs

1
2
3
4
5
// 스트림의 요소들 중 최대값 리턴
Optional<String> max = stream.max(String::compareToIgnoreCase);
if (max.isPresent()) {
    System.out.println("max: " + max.get());
}
cs

1
2
3
4
5
// 스트림의 요소들 중 첫번째 값 리턴
Optional<String> startWithS = stream.filter(s -> s.startsWith("S")).findFirst();
if (startWithS.isPresent()) {
    System.out.println("findFirst: " + startWithS.get());
}
cs

1
2
3
4
5
6
// 스트림에서 순서에 상관없이 일치하는 값 하나를 반환
Optional<String> startWithS = stream.filter(s -> s.startsWith("S")).findAny();
if (startWithS.isPresent()) {
    System.out.println("findAny: " + startWithS.get());
}
 
cs


이처럼 기본 reduce 연산은 물론 스트림을 서로 결합시키거나 map이나 array로 만드는 등 여러가지 연산이 가능하다.

보다시피 복잡하게 구현될 코드들을 추상화를 통해 간편하게 사용할 수 있도록 했음을 알 수 있다.


스트림 API의 단점


스트림 api가 가진 단점은


1. 팀원들간의 공통된 이해가 필요하다.

2. 추상화 되어있기 때문에 사용 간에 실수가 일어날 수 있다.

3. 무조건적인 성능 상승 효과는 없다.


이정도이다. 즉 라이브러리에 대한 이해가 부족하면 사용하기 까다로운 것이다. 하지만 간단한 연산만 하는 경우(ex. 알고리즘 문제 풀이)에서는 유용하게 사용할 수 있을 것 같다.

'공부 > JAVA' 카테고리의 다른 글

OSIV  (401) 2020.10.28
N+1 문제  (0) 2020.10.28
CAS(Compare And Swap) 알고리즘  (0) 2020.08.06
String, StringBuffer, StringBuilder  (0) 2018.03.17
abstract class와 interface  (0) 2018.03.17
Comments