5. 자바8 함수형 프로그래밍
람다와 메서드 레퍼런스
• 람다와 메서드 레퍼런스가 일급(first-class)으로 새롭게 추가.
• 일급(firstClass) 파라미터로 데이터를 넘기거나 변수로 할당할 수
있다.
• Primitive type : int, boolean, float
• Reference type : String, new 키워드로 생성한 각종 객체들
• Method reference : 메소드 블럭의 메모리상 주소 값
• Lambda : 익명함수 블록의 메모리상 주소값
6. 자바8 함수형 프로그래밍
레거시 자바에서 inventory 정렬하기
Collections.sort(inventory, new Comparator<Apple>() {
@Override
public int compare(Apple o1, Apple o2) {
return Integer.compare(o1.getWeight(), o2.getWeight());
}
});
11. 자바8 default method
default 키워드를 사용하면 인터페이스에 메서드를 바로 설정 가
능
기존의 구현체 구조를 변경하지 않고도 새로운 기능을 추가 할
수 있다.
<Interface>
List
ArrayList
LinkedList
AnotherList
12. 자바8 Stream API
• 스트림이란 한번에 한개씩 만들어지는
연속적인 데이터들의 모임이다.
• 자바8에서는 작업을 높은 수준으로 추상화
해서
스트림으로 만들어 처리할 수 있다.
• 스트림 파이프라인을 이용해서 추상화된 병
렬처리가 가능하다.
13. 레거시 자바로 데이터 추출하기
칼로리 400이하의 메뉴를 정렬한 뒤 이름을 출력하라
List<Dish> lowCaloricDishes = new ArrayList<>();
// 칼로리가 400이하인 메뉴만 가지고 온다.
for (Dish d : menu) {
if (d.getCalories() < 400)
lowCaloricDishes.add(d);
}
// 칼로리 순으로 정렬한다
Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
@Override
public int compare(Dish o1, Dish o2) {
return Integer.compare(o1.getCalories(), o2.getCalories());
}
});
// 요리 이름만 가지고 온다.
List<String> lowCaloricDishesName = new ArrayList<>();
for (Dish d : lowCaloricDishes) {
lowCaloricDishesName.add(d.getName());
}
자바8 Stream API
14. 자바8 Stream API를 사용한 데이터 추출
List<String> lowCaloricDishesName = menu
.stream()
.filter(d -> d.getCalories() < 400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());
자바8 Stream API
15. 자바8 Stream API를 사용한 데이터 추출(병렬로 처
리)
List<String> lowCaloricDishesName = menu
.parallelStream()
.filter(d -> d.getCalories() < 400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());
자바8 Stream API
17. 정리
• 함수가 일급(first-class)이 되었다.
• 람다를 통해 익명클래스를 단순화
• 메서드 레퍼런스로 람다를 보다 간단하게 작성가능.
• 디폴트 메서드 추가
• 인터페이스에 메서드 바디를 제공
• 스트림기능 추가
• 복잡한 컬렉션 조작을 단순화
• 기존에 복잡했던 병렬 처리도 쉽게 구현가능