이펙티브 자바
아이템 46. 스트림에서는 부작용 없는 함수를 사용하라.
스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 부분이다. 이때 각 단계는 가능한 한 이전 단계의 결과를 받아 처리 하는 순수 함수여야 한다.
순수 함수란 입력만이 결과에 영향을 주는 함수이다.
그래서 side effect가 없어야 된다.
아래 코드를 보자
1 |
|
실행결과
1 |
|
위에 코드를 보면 무엇이 문제인지 보이는가?
위에 코드는 람다의 이점을 살리지 못하고 같은 반복적 코드보다 코딩량이 길어졌다고 하는데 음 모르겠다. 일단 반복적인 코드르 짠것을 보면
1 |
|
실행결과
1 |
|
위에 코드를 반복문 스타일로 만들어 보았는데 토큰라이징을 위에 코드 보다 짧게 할수있는지 모르겠다.
일단 동의 하는 부분은 반복문 스타일로 스트림 코드를 만들었다는거다.
그럼 좀더 좋게 변화 시키면
1 |
|
실행결과
1 |
|
위에 처럼 바꿀수 있다 더 스트림 스럼다
forEach 연산은 종단 연산 중 기능이 가장 적고 덜 스트림답다. 그리고 대놓고 반복이라 병렬화도 할수없다. forEach연산은 스트림 계산 결과를 보고할 때만 사용하고 계산하는데는 쓰지 말자
빈도표에서 가장 흔한 단어 10개를 뽑아내는 파이프라인을 만들어 보면
1 |
|
실행결과
1 |
|
위에 코드도 java.util.stream.Collectors 클래스를 사용하는데 스트림을 사용할때 꼭알아야 되는 클래스이다.
jdk 11 기준으로 메소드도 53개나 되고 있다. 위에 클래스를 잘활용하여 스트림 API를 잘 활용하자.