Chapter7 람다와 스트림
1. 익명 클래스보다는 람다를 이용하라
- 람다는 익명 클래스와 개념은 비슷하지만 코드의 길이는 훨씬 짧다.
- 하지만 람다는 이름이 없고 문서화도 할 수 없기 때문에, 그 의미가 불명확하면 사용하지 말아야 한다.
- 또한 람다의
this
는 자기 자신이 아니라 바깥의 객체를 나타낸다.(자신 참조x)
- 또한 람다의
- 하지만 람다는 이름이 없고 문서화도 할 수 없기 때문에, 그 의미가 불명확하면 사용하지 말아야 한다.
2. 람다보다는 메서드 참조를 사용하라
- 대부분 메서드 참조는 람다보다 코드의 길이가 더 짧게 사용이 가능하다.
- 또한 메서드 이름을 통하여 기능을 확실히 알 수 있게 해준다.
- 항상 그런 것은 아니므로 람다와 메서드 참조를 적절히 선택해서 사용해야 한다.
3. 표준 함수형 인터페이스를 사용하라
함수형 인터페이스가 미리 정의가 되어 있으므로, 필요한 용도에 맞는게 있으면 직접 구현하지말고 찾아서 사용하는 편이 낫다.
- 다루는 API 개념의 수가 줄어들고, 다른 사람도 이해하기가 편리하기 때문이다.
기본 함수형 인터페이스
인터페이스 함수 시그니처 예 UnaryOperator<T> T apply(T t) String::toLowerCase BinaryOperator<T> T apply(T t1, T t2) BigInteger::add Predicate<T> boolean test(T t) Collection::isEmpty Function<T> R apply(T t) Arrays::asList Supplier<T> T get() Instant::now Consumer<T> void accept(T t) System.out::println
4. 스트림은 주의해서 사용하라
- 스트림은 다량의 데이터 처리 작업을 돕는 API
- 사용처
- 원소들의 시퀀스를 일관되계 변환
- 필터링
- 하나의 연산을 사용해 결합
- 컬렉션으로 변환(공통된 속성)
- 스트림을 사용할 때는 반복문보다 더 유용한 경우도 있고, 그렇지 않은 경우도 있으니 둘 다 작성해보고 더 나은것을 선택하여야 한다.
5. 스트림에서는 부작용 없는 함수를 사용하라
- 스트림의
forEach()
는 계산 결과를 보고할 때만 사용하고, 계산할 때 사용하는 것을 지양하여야 한다. - 수집기(
toList
,toSet
,toMap
,groupingBy
,joining
등)를 사용하여 반환을 해야 한다.
6. 반환 타입으로는 스트림보다 컬렉션이 낫다
스트림은
iterarble
을 확장 하지 않는다.따라서
iterable
을 사용하고 싶을 때는 어뎁터로 중계해서 사용해야 한다.public static <E> Iterable<E> iterableOf(Stream<E> stream) { return stream::iterator; }
반대의 경우(
iterable
→Stream
)도 어뎁터를 생성해서 중계해야 한다.한가지만 사용한다면 이렇게 직접 어뎁터를 작성해서 사용해도 되는데, 하나만 사용하다고 확신할 수 있는 순간이 많지 않다.
→ 컬렉션으로 반환하여 두 가지 방법을 사용할 수 있게 해 주자.
7. 스트림 병렬화는 주의해서 적용하라
- 스트림을 잘못 병렬화하면 성능이 나빠질 뿐만 아니라 예상하지 못한 동작이 발생할수도 있다.
Stream.iterate
나limit
을 사용하면 병렬 연산의 이점이 없어진다.collect
메서드도 효과가 떨어진다.
- 병렬화는
ArrayList
,HashMap
,HashSet
,ConcurrentHashMap
,int
범위,long
범위일 때 효과가 좋다.- 다수의 스레드에 분배하기 쉽게
Spliterator
가 작업을 쪼개준다.
- 다수의 스레드에 분배하기 쉽게
※ 참고
- 이펙티브 자바 - 조슈아 블로크
'BOOK > [이펙티브 자바]' 카테고리의 다른 글
[Effective Java] Chapter8 메서드 (0) | 2022.03.22 |
---|---|
[Effective Java] Chapter6 열거 타입과 애너테이션 (0) | 2022.03.15 |
[Effective Java] Chapter5 제네릭 (0) | 2022.02.15 |
[Effective Java] Chapter4 클래스와 인터페이스 (0) | 2022.02.10 |
[Effective Java] Chapter3 모든 객체의 공통 메서드 (0) | 2022.02.08 |