[Effective Java] Chapter7 람다와 스트림

2022. 3. 17. 09:00· BOOK/[이펙티브 자바]
목차
  1. 1. 익명 클래스보다는 람다를 이용하라
  2. 2. 람다보다는 메서드 참조를 사용하라
  3. 3. 표준 함수형 인터페이스를 사용하라
  4. 4. 스트림은 주의해서 사용하라
  5. 5. 스트림에서는 부작용 없는 함수를 사용하라
  6. 6. 반환 타입으로는 스트림보다 컬렉션이 낫다
  7. 7. 스트림 병렬화는 주의해서 적용하라
  8. ※ 참고

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
  1. 1. 익명 클래스보다는 람다를 이용하라
  2. 2. 람다보다는 메서드 참조를 사용하라
  3. 3. 표준 함수형 인터페이스를 사용하라
  4. 4. 스트림은 주의해서 사용하라
  5. 5. 스트림에서는 부작용 없는 함수를 사용하라
  6. 6. 반환 타입으로는 스트림보다 컬렉션이 낫다
  7. 7. 스트림 병렬화는 주의해서 적용하라
  8. ※ 참고
'BOOK/[이펙티브 자바]' 카테고리의 다른 글
  • [Effective Java] Chapter8 메서드
  • [Effective Java] Chapter6 열거 타입과 애너테이션
  • [Effective Java] Chapter5 제네릭
  • [Effective Java] Chapter4 클래스와 인터페이스
쿠엔크
쿠엔크
우아한테크코스 5기 BE 에단 Github : https://github.com/cookienc
쿠엔크
기러기는 기록기록
쿠엔크
전체
오늘
어제
  • 분류 전체보기 (132)
    • CS (46)
      • [OS] (12)
      • [NETWORK] (10)
      • [DATABASE] (11)
      • [BASIC CONCEPT] (1)
      • [DATA STRUCTURE] (7)
      • [ALGORITHM] (5)
    • LANGUAGE (17)
      • [JAVA] (17)
    • DESIGN_PATTERN (2)
    • FRAMEWORK (18)
      • [SPRING] (18)
    • ORM (11)
      • JPA (11)
    • AWS (7)
    • BOOK (10)
      • [자바 웹 개발 워크북] (3)
      • [이펙티브 자바] (7)
    • 개발 (19)
      • [오류] (7)
      • [고민] (1)
      • [우테코] (10)
      • [iTracker] (1)
    • Tip (1)
      • [Plugins] (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • JVM
  • Spring
  • 자바 웹 개발 워크북
  • 스프링
  • 네트워크
  • aws
  • 운영체제
  • Effective Java
  • 데이터베이스
  • java
  • 오류
  • 알고리즘
  • 디자인 패턴
  • 개념
  • 자료구조
  • JPA
  • ArgumentResolver
  • HTTP
  • CORS
  • 가비아

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
쿠엔크
[Effective Java] Chapter7 람다와 스트림

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.