DEV ℧ Developer Diary

[EffectiveJava] item46 - 스트림에서는 부작용 없는 함수를 사용하라

스트림은 처음 봐서는 이해하기 어려울 수 있다.

스트림은 그저 또하나의 API가 아닌, 함수형 프로그래밍에 기초한 패러다임이기 때문이다. 스트림이 제공하는 표현력, 속도, 병렬성을 얻으려면 API는 말할 것도 없고 이 패러다임 까지 함께 받아들어야 한다.

스트림 패러다임

스트림 패러다임의 핵심은 계산을 일련의 변환(transformations)으로 재구성 하는 부분이다....

[EffectiveJava] item45 - 스트림은 주의해서 사용하라

스트림 API는 다량의 데이터 처리 작업(순차 또는 병령)을 돕고자 자바8에 추가된 기능이다.

Stream API

스트림 API가 제공하는 추상 개념 중 핵심은 두가지이다.

  • 스트림(stream)은 데이터 원소의 유한 혹은 무한 시퀀스(sequence)를 뜻한다.
  • 스트림 파이프라인(stream pipeline)은 이 원소들로 수행하는 연산 단계를 표현하는 개념이다.

스트림은 대표적으로...

[EffectiveJava] item44 - 표준 함수형 인터페이스를 사용하라

자바가 람다를 지원하면서 API를 작성하는 모범 사례도 템플릿 메서드 패턴에서 정적 팩터리나 생성자를 제공하는 형태로 많이 변화했다.

위의 내용을 풀어 말하자면, 함수 객체를 매개변수로 받는 생성자와 메서드를 더 많이 많들어야 한다는 것이다. 이때 함수형 매개변수 타입을 올바르게 선택하도록 해야한다.

함수형 매개변수 타입

예를 들어...

[EffectiveJava] item43 - 람다보다는 메서드 참조를 사용하라

람다가 익명 클래스보다 나은 점 중에서 가장 큰 특징은 간결함이다.

하지만 메서드 참조(method reference)를 사용하면 함수 객체를 람다보다 더 간결하게 만들어 줄 수 있다.

간단하게 예시를 들어보자.

map.merge(key, 1, (count,...

[EffectiveJava] item42 - 익명 클래스보다는 람다를 사용해라

자바에서 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스(드물게는 추상 클래스)를 사용했다. 이런 인터페이스의 인스턴스를 함수객체(function Object)라고 하여 , 특정 함수나 동작을 나타내는 데 썻다.

JDK1.1 등장 이후 함수객체를 만드는 주요 수단은 익명 클래스가 되었고, 다음과 같은 예시로 쓰였다.

<pre...