생각해보기
이펙티브 자바 -6- 본문
익명 클래스보다는 람다를 사용하라
타입을 명시해야 코드가 더 명확할 때만 제외하고는, 람다의 모든 매개변수 타입은 생략하자 동작을 명확하게 드러나는 것이 좋다
람다함수에서 만약 코드 자체로 동작이 명확이 설명이 되지 않거나 코드 줄 수가 많아지면 람다를 사용하지 말아야 한다. 람다는 한줄일 때 가장 좋고 길어야 세 줄 안에 끝내는 게 좋다
람다는 익명 클래스처럼 직렬화 형태가 구현별로 다를 수 있다. 따라서 람다를 직렬화하는 일은 삼가야 한다
람다 보다는 메서드 참조를 사용하라
메서드 참조는 람다의 간단명로한 대안이 될 수 있다. 메서드 참조 쪽이 짧고 명확하다면 메서드 참조를 쓰고, 그렇지 않을 때 람다를 사용하라
표준 함수형 인터페이스를 사용하라
필요한 용도에 맞는 게 있다면, 직접 구현하지 말고 표준 함수형 인터페이스를 활용하라 도한 직접 만든 함수형 인터페이스에는 항상 @FunctionalInterface 애너테이션을 사용하자
스트림은 주의해서 사용하라
스트림을 과용하면 프로그램이 읽거나 유지보수하기 어려워진다.
주의 사항
- 람다 함수를 사용할때 타입 이름을 자주 생략하므로 매개 변수 이름을 잘 지어야 스트림 파이프라인의 가독성이 유지된다
- char 값들을 처리할 때는 스트림을 삼가는 편이 낫다
- 기존 코드는 스트림을 사용하도록 리팩터링하되, 새 코드가 더 나아 보일 때만 반영하자, 다음은 스티림이 좋은 경우 이다
- 원소들의 시퀀스를 일관되게 변환한다
- 원소들의 시퀀스를 필터링 한다
- 원소들의 시퀀스를 하나의 연산을 사용해 결합한다
- 원소들의 시퀀스를 컬렉션에 모은다
- 원소들의 시퀀스에서 특정 조건을 만족하는 원소를 찾는다
정리
스트림과 반복 중 어느 쪽이 나은지 확신하기 어렵다면 둘 다 해보고 더 나은 쪽을 택하라
스트림에서는 부작용 없는 함수를 사용하라
스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 부분이다. 각 변환 단계는 가능한 이전 단계의 결과를 받아 처리하는 순수 함수여야 한다.
순수함수란 오직 입력만이 결과에 영향을 주는 함수를 말한다. 다른 가변 상태를 참조하지 않고, 함수 스스로도 다른 상태를 변경하지 않는다. 이렇게 하려면 스트림 연산에 건내는 함수 객체는 모두 부작용이 없어야 한다
스트림 함수 중 forEach 연산은 스트림 계산 결과를 보고할 때만 사용하고, 계산하는 데는 사용하지 말자
정리
스트림 파이프라인 프로그래밍의 핵심은 부작용 없는 함수 객체에 있다. 스트림 뿐만 아니라 스트림 관련 객체에 건네지는 모든 함수 객체가 부작용이 없어야 한다.
반환 타입으로는 스트림보다 컬렉션이 낫다
Collection 인터페이스는 Iterable 하위 타입이고 stream 메서드도 제공하니 반복과 스트림을 동시게 지원한다. 따라서 원소 시퀸스를 반환하는 공개 API의 반환 타입에는 Collection이나 그 하위 타입을 쓰는 게 일반적으로 최선이다.
정리
원소 시퀸스를 반환하는 메서드를 작성핼 때는, 이를 스트림으로 처리하기를 원하는 사용자와 반복으로 처리하길 원하는 사용자가 모두 있을 수 있음을 떠울리고, 양쪽을 다 만족시켜려 노력하자(컬렉션)
스트림 병렬화는 주의해서 적용하라
데이터 소스가 Stream.iterate이거나 중간 연산으로 limit을 쓰면 파이프라인 병렬화로는 성능 개선을 기대할 수 없다. 대체로 스트림의 소스가 ArrayList, HashMap, HashSet, ConcurrentHashMap의 인스턴스거나 배열, int 범위, long 범위 일때 병렬화의 효과가 가장 좋다.
스트림을 잘못 병렬화 하면 성능이 나빠질 뿐만 아니라 결과 자체가 잘못되거나 예상 못함 동작이 발생할 수 있다. 하지만 조건이 잘 갖춰지면 parallel 메서드 호출 하나로 거의 프로세서 코어 수에 비례하는 성능 향상을 높일 수 있다.
정리
운영 환경과 유사한 조건에서 수행해보며 성능 지표를 관찰해라. 계산도 성능도 좋아졌음을 확실해 졌을 때ㅔ 병렬화 버전 코드를 운영 코드에 반영해라
'자바' 카테고리의 다른 글
이펙티브 자바 -8- (0) | 2022.01.14 |
---|---|
이펙티브 자바 -7- (0) | 2022.01.13 |
이펙티브 자바 -5- (0) | 2022.01.07 |
이펙티브 자바 -4- (0) | 2022.01.05 |
이펙티브 자바 -3- (0) | 2022.01.03 |