자바8이 등장하면서 lambda식이 도입되었고 collection에 stream이라는 메서드가 추가되었다
lambda를 통해 데이터 collection의 반복처리가 간단명료해지게 되었고
stream을 통해 분기처리없이 데이터 collection의 요소를 반복처리할 수 있게 되었다.
하지만!
lambda가 기존의 코드를 모두 대체하기 위해 등장한 것이 아니라는 점을 알고 있어야하며
stream 역시 편리해졌다고 성능이나 속도측면에서 좋다라고는 할 수 없다
lambda란?
lambda는 메서드를 하나의 식으로 표현하며,
background에서 반복작업이 이루어지고 개발자는 메서드만 알면 수행할 수 있다
for-loop과 forEach를 비교해보면 이해가 쉽다
- For-loop(external iterator/정통방식)
for-loop은 루프를 직접 생성하며 개별 요소를 처리한다
어느지점에서든 items값의 변경이 가능하며 루프안에서 items의 상태변화를 시킬 수 있다
for (String item: items){
//TODO
}
- Foreach(internal iterator/lambda방식)
forEach도 반복이 되긴하지만 lambda식 안의 로직에서는 item요소에 대해서만 값을 처리할 수 있다
루프안에서 items의 상태변화를 줄 수도 없다
items.forEach(item->{
//TODO
})
lambda가 좋은거 아닌가?
사실 가독성측면에서 좋을 수 있다. 하지만 람다에 대해 잘 모르는 사람에게는 가독성이 좋지만은 않을 것이다
또한 lambda는 기본적으로 익명함수 기반이기에 디버깅이 어려운 부분이 있다
내부적으로 수행하는 작업이 더 많기 때문에, 코드가 복잡해질수록 문제발생 지점을 확인하기 힘들 수 있다
Stream이란?
stream은 선언형으로 데이터 컬렉션을 반복적으로 처리할 수 있다
lambda식을 지원하며 중간연산(filter,map..)과 최종연산(foreach,count,collect..)이 있다
여러 연산을 조립해서 사용할 수 있으며, 병렬로 처리하기 때문에 성능이 좋은 편이다
자바 6이전까지는 데이터 컬렉션 요소를 순차적으로 처리하기 위해 Iterator라는 반복자를 사용했다면
Iterator<String> iter = items.iterator();
while(iter.hasNext()) {
if(iter.next()!=null){
System.out.println(iter.next());
}
}
stream을 활용하면 코드가 훨씬 단순해지게된다
Stream<String> stream = list.stream();
stream.filter(item->item!=null).forEach(item -> System.out.println(item));
그럼 stream은 무조건 좋은건가?
나 또한 스트림을 처음알았을 때 마냥 좋아보였고 앞으로 자주 써야겠다 생각했지만
여러 블로그를 참고해보면 성능측면에서 단연 좋다고만 할 수는 없어보였다
자바8 Streams API 를 다룰때 실수하기 쉬운것 10가지: https://hamait.tistory.com/547
Java8 Parallel Stream, 성능장애를 조심하세요!: https://m.blog.naver.com/tmondev/220945933678
내가 내린 결론은..
stream은 분할이 잘 이루어질 수 있는 데이터 구조이거나, 연산작업이 독립적이면서 CPU사용이 높은 작업에 적합한 것으로 보인다
앞으로 속도나 성능이 중요할 때는 반복문, stream 을 잘 테스트해서 적절히 사용해야할 것 같다
'java' 카테고리의 다른 글
| List 일정 개수만큼 반복 분할 처리 (2) | 2020.07.06 |
|---|
댓글