Effective Java 6 | Lamda, Stream

공부의 기록·2021년 12월 14일
0

Java (Effective Java)

목록 보기
7/12
post-thumbnail

Lamda, Stream

본 문서는 2021년 12월 23일 에 작성되었습니다.

만약 당신이 하나의 메서드(함수) 만을 객체화(인스턴스화) 하고 싶다면 어떤 방법이 있을까?

  1. 함수 객체 생성
  2. 익명 객체
  3. 람다식

예전에서는 추상 메서드를 하나만 담은 인터페이스(추상 클래스) 를 사용했다.
이런 인터페이스의 객체를 함수 객체(function object) 라고 하며 특정 함수나 동작을 나타내는 데 썼다.

이후 jdk 1.1 이 나오면서 이를 익명 클래스, 익명객체 라고 하였다.
그러나 이러한 방식은 생각보다 코그다 길어서 불편했다.

이후 jdk 1.8 이 나오면서 이를 Lamda 식 이라고 부르게 되었다.

본문은 이러한 Lamda 식에 대한 이야기를 다루고 있다.


아이템 42 | Lamda 권고

원제목 | 익명 클래스보다 람다를 사용하라

일반적인 단순 메서드의 기능은 람다식을 사용하자.

그러나 아래의 경우에는 람다식을 사용하지 말아야 한다.

  1. 람다식이 세줄이 넘어가는 경우
  2. 추상 클래스의 객체(인스턴스) 를 만들어야 하는 경우
  3. 추상 메서드가 여러 개인 인터페이스의 객체(인스턴스) 를 만들어야 하는 경우
  4. 람다식을 직렬화 해야 하는 경우

2번과 3번의 경우 익명클 클래스를 사용하도록 하자.
4번의 경우 private 정적 중첩 클래스 (Comparator) 를 사용하자.


아이템 43 | :: 권고

원제목 | 람다보다는 메서드 참조를 사용하라

Java : Lamda 중 Method Reference 을 참고하자
아이템 42 | Lamda 권고 에서도 알수 있듯이, 람다식은 간결함을 추구한다.
아이템 43 | :: 권고 에서도 메서드 참조는 간결함을 추구한다고 말한다.

본 도서에서는 아래와 같이 표현하고 있다.

일반적으로 메서드 참조가 더 간결하니 메서드 참조를 사용하되,
그렇지 않은 경우에는 람다식을 통해서 표현하자.

유일한 예외는 261p 를 참고하자.

하지만 이러한 다양한 문법의 혼재는 읽는 이를 배려하지도 않고
문맥 전체의 혼란을 야기할 수 있지 않을까 라는 걱정을 한다.

그럼에도 불구하고 혼용해야 한다면,
Integer 클래스등의 대중적인 메서드 선에서 만족해야 하지 않을까 싶다.

map.merge(key, 1, (count, incr) -> count + incr));
map.merge(key, 1, Integer::sum);

Method References 의 종류는 다음과 같다.

메서드 참조 유형메서드 참조 코드람다식 코드
정적Integer::parseIntstr -> Integer.parseInt(str);
한정적Integer.now()::isAfterInstnt them=Instant.now();
t -> then.isAfter(t);
비한정적String::toLowerCasestr -> str.toLowerCase()
클래스 생성자TreeMap<K,V>::new() -> new TreeMap<K,V>()
배열 생성자int[]::newlen -> new int[len]

다음과 같은 내용은 차후에 알아보는 것으로 멈춰두었다.

아이템 44 | 표준 함수형 인터페이스를 사용하라

아이템 45 | 스트림을 주의해서 사용하라

아이템 46 | 스트림에서는 부작용 없는 함수를 사용하라

아이템 47 | 반환 타입으로는 스트림보다 컬랙션이 낫다

아이템 48 | 스트림 병렬화는 주의해서 적용해라

profile
2022년 12월 9일 부터 노션 페이지에서 작성을 이어가고 있습니다.

0개의 댓글