자바 역사를 통틀어 가장 큰 변화가 자바 8에서 일어났다.
자바8은 간결한 코드, 멀티코어 프로세서의 쉬운 활용 이 두가지 요구사항을 기반으로 한다.
스트림을 이용하면 에러를 자주 일으키며, 멀티코어 CPU를 이용하는 것보다 비용이 훨씬 비싼 키워드 synchronized를 사용하지 않아도 된다.
메서드에 코드를 전달하는 기법을 사용하면 동작 파라미터화(behavior parameterization)
를 구현할 수 있다.
메서드에 코드를 전달(뿐만 아니라 결과를 반환하고 다른 자료구조로 전달할 수 도 있음)하는 자바 8 기법은 함수형 프로그래밍(functional-style programming)
에서 위력을 발휘한다.
스트림이란 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임이다.
자바 8에는 java.util.stream
패키지에 스트림 API가 추가 되었다.
스트림 API의 핵심은 기존에는 한 번에 한 항목을 처리했지만, 우리가 하려는 작업을 데이터베이스 질의 처럼 고수준으로 추상화해서 일련의 스트림으로 만들어 처리할 수 있다는 것이다.
동작 파라미터화
라고 부른다.스트림 API는 연산의 동작을 파라미터화할 수 있는 코드를 전달한다는 사상에 기초하기 때문이다.
병렬성을 공짜로 얻을 수 있다
라는 말에서 시작된다.보통 다른 코드와 동시에 실행 하더라도 안전하게 실행할 수 있는 코드를 만들려면 가변 데이터(shared mutable data)에 접근하지 않아야 한다. 이러한 함수를 순수(pure) 함수, 부작용 없는 함수(side-effect-free), 상태 없는(stateless) 함수 라고 부른다.
일급(first-class) 값 또는 시민(citizens)
이라고 부른다.일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.
다음과 같은 조건을 가진다.
메서드 참조
(method reference)
::
이를 통해 메서드가 이급값이 아닌 일급값이다.
메소드 블럭의 메모리상 주소 값
람다 : 익명함수
자바 8에서는 메서드를 일급 값으로 취급할 뿐 아니라 람다(또는 익명함수 anonymous functions)를 포함하여 함수도 값으로 취급할 수 있다.
람다 문법 형식으로 구현된 프로그램을 함수형 프로그래밍이라고 한다.
Map<Curreny, List<Transaction>> transactionByCurrencies = new HashMap<>(); // 그룹화된 트랜잭션을 더할 Map 생성
for(Transaction transaction : transactions) {
if(transaction.getPrice() > 1000) {
Curreny curreny = transacation.getCurrency(); // 트랜잭션의 통화를 추출
List<Transcation> transactionsForCurrency = transactionsByCurrencies.get(currency);
if(transactionsForCurrency == null) {
transactionsForCurrency = new ArrayList<>();
transactionsByCurrencies.put(currenc, transcationsForCurrency);
}
transactionsForCurrency.add(transacation);
}
}
import static java.util.stream.Collectors.groupingBy;
Map<Currency, List<Transaction>> transactionsByCurrencies = transactions.stream()
.filter((Transcations t) -> t.getPrice() > 1000); // 고가의 트랜잭션 필터링
.collect(groupingBy(Transcation::geturrency)); // 통화로 그룹화
모호함과 반복적인 코드 문제
와 멀티코어 활용 어려움
이라는 두 가지 문제를 모두 해결했다.함수를 일급값으로 사용한다
라는 의미도 있지만, 부가적으로 프로그램이 실행되는 동안 컴포넌트 간에 상호작용이 일어나지 않는다
라는 의미도 포함한다.디폴트 메서드는 특정 프로그램을 구현하는 데 도움을 주는 기능이 아니라 미래에 프로그램이 쉽게 변화할 수 있는 환경을 제공하는 기능
이다.구현하지 않아도 되는 메서드
이다.Optional<T>
클래스를 제공한다.