SlideShare a Scribd company logo
1 of 18
Download to read offline
자바8 람다식
최범균, 2014-05-29
자바7, 6, 5, ...
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
};
자바8
Comparator<Integer> comparator = (o1, o2) -> o2 - o1;
람다식(lambda expression)
●  단순히 정의하면, 프로그래밍에서 식별값 없이 실행
할 수 있는 함수 표현 방법
o  이미 많은 언어에서 지원: Ruby, C#, Python,
o  람다식을 이용한 함수를 생성 예
§  scala: someList.filter(x => x > 0)
●  함수형(Functional) 언어에서 함수는 1급(first-
level class)임
o  함수를 변수에 할당, 파라미터로 전달하는 게 가능
●  자바는 함수가 없는데...?
자바8의 람다식
●  함수형(Functional) 인터페이스의 임의 객체를 람
다식으로 표현
o  함수형 인터페이스: 추상 메서드가 1개인 인터페이스
public interface Comparator<T> {
int compare(T o1, T o2);
}
Comparator<Long> comp = (Long o1, Long o2) -> o2 - o1 < 0 ? -1 : 1
람다식의 구성
(Long val1, String val2) -> val1 + val2.length()
파라미터 결과 값
몇 가지 람다식 예
public interface Operator<T> {
public T operate(T op1, T op2);
}
public interface Callable<V> {
V call() throws Exception;
}
public interface Runnable {
public void run();
}
public interface Predicate<T> {
boolean test(T t);
}
// 파라미터 타입 지정
Comparator<Long> longComparator =
(Long first, Long second) -> Long.compare(first, second);
// 파라미터 타입 지정하지 않음, 문맥에서 유추
Comparator<Long> longComparator =
(first, second) -> Long.compare(first, second);
// 파라미터가 한 개인 경우, 파라미터 목록에 괄호 생략
Predicate<String> predicate = t -> t.length() > 10;
// 파라미터가 없는 경우
Callable<String> callable = () -> "noparam";
// 결과 값이 없는 경우
Runnable runnable = () -> System.out.println("no return");
// 코드 블록을 사용할 경우, return을 이용해서 결과 값을 리턴
Operator<Integer> plusSquareOp = (op1, op2) -> {
int result = op1 + op2;
return result * result;
};
람다식과 프리 변수
int multiple = 10;
Operator<Integer> operator = (x) -> x * multiple;
int result = operation( operator );
프리 변수(free variable):
람다식의 파라미터나 식 내부에서 선언되지 않은 변수
●  자바는 람다식에서 사용하는 프리변수의 값을 변경할 수 없음
●  임의 객체의 경우 프리 변수를 반드시 final로 지정해야 했지만, 람다식의
경우 프리 변수의 값이 바뀌지 않으면 컴파일러가 에러를 발생하지 않음
몇 가지 미리 정의된 함수형 인터페이스
java.util.function 패키지에 다양한 상황
에 사용할 수 있는 함수형 인터페이스 정
의됨
public interface Function<T, R> {
R apply(T t);
}
public interface Predicate<T> {
boolean test(T t);
}
public interface BiFunction<T, U, R> {
R apply(T t, U u);
}
public interface Supplier<T> {
T get();
}
public interface Consumer<T> {
void accept(T t);
}
함수형 인터페이스 강제
●  @FuntionalInterface 사용
o  @FuntionalInterface가 붙은 인터페이스가 추상 메서드를
두 개 이상 가지면 컴파일 에러 발생!
@FunctionalInterface
public interface Operator<T> {
public T operate(T op1, T op2);
}
메서드 레퍼런스
기존 코드
public class SomeView
implements OnClickListener {
private void init() {
myBtn.setOnClickListener(this);
youBtn.setOnClickListener(this);
}
@Override
public void onClick(ClickEvent e) {
…
if (e.getSource() == myBtn) {
...
}
}
}
메서드 레퍼런스 사용
public class SomeView {
private void init() {
myBtn.setOnClickListener(this::onMyBtnClick);
youBtn.setOnClickListener(this::onYouBtnClick);
}
private void onMyBtnClick(ClickEvent e) {
...
}
private void onYouBtnClick(ClickEvent e) {
...
}
}
메서드 레퍼런스 종류
●  클래스::정적메서드
o  someOperation( Op::square );
§  someOperation( (x, y) -> Op.square(x, y) );
●  객체::인스턴스메서드
o  someOperation( obj::square );
§  someOperation( (x, y) -> obj.square(x, y) );
o  someOperation( this::square );
o  someOperation( super::square );
●  클래스::인스턴스메서드
o  someOperation( XClass::double )
§  someOperation( (x, y) -> x.double(y) )
인터페이스의 변화
●  디폴트 메서드(default method)
o  인터페이스 메서드가 구현을 가질 수 있음
●  정적 메서드
o  인터페이스가 정적 메서드를 가질 수 있음
디폴트 메서드
public interface Collection<E> extends Iterable<E> {
Iterator<E> iterator();
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
LinkedList<Long> list = ….;
list.removeIf((e) -> e > 10L);
디폴트 메서드의 우선 순위
class Team {
public int version() {
return 0;
}
}
interface Verion {
default int version() {
return -1;
}
}
interface Lockable {
default int version() {
return 1;
}
}
class ExtTeam
extends Team
implements Version {
}
항상 클래스가 우선순위 가짐
- ExtTeam 객체의 getVersion()은
Team 클래스의 getVersion() 사용
class Job implements
Version, Lockable {
@Override
public int version() {
return Version.super.getName()
}
}
상속받은 인터페이스들의 같은 시그너처
를 갖는 메서드 중 한 개라도 디폴트 메서
드가 있으면,
하위 타입에서 재정의해 주어야 함
Optional과 람다식의 만남
●  java.util.Optional이란?
o  값이 있거나 또는 없는 경우를 표현하기 위한 클래스
o  간단한 예
§  Optional<Long> value = someMethod();
if (value.isPresent()) {
Long val = value.get();
}
o  map, filter 등의 고차원(higher order) 함수를 가짐
§  public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
§  public Optional<T> filter(Predicate<? super T> predicate)
§  public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
Optional과 람다식의 만남
●  Optional과 고차원 함수의 조합
Optional<Member> mem = findMemberById(1L);
Coord result = mem.map(Member::getAddress)
.map(address -> address.getZipCode())
.map(zipCode -> findCoord(zipCode))
.orElse(null);
Member mem = findMemberById(1L);
Coord result = null;
if (mem != null) {
if (mem.getAddress() != null) {
String zipCode = mem.getAddress().getZipCode();
if (zipCode != null) result = findCoord(zipCode);
}
}
기타
●  자바8 스트림API: 함수형 인터페이스 천국
o  filter(Predicate)
o  map(Function)
o  sorted(Comparator)
o  forEach(Consumer)
o  reduce(identity, BinaryOperator)
o  …

More Related Content

What's hot

애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향
Young-Ho Cho
 
ABI란 무엇인가요?
ABI란 무엇인가요?ABI란 무엇인가요?
ABI란 무엇인가요?
진상 문
 

What's hot (20)

이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정
 
Drools 6 deep dive
Drools 6 deep diveDrools 6 deep dive
Drools 6 deep dive
 
[수정본] 우아한 객체지향
[수정본] 우아한 객체지향[수정본] 우아한 객체지향
[수정본] 우아한 객체지향
 
Clean Architecture Applications in Python
Clean Architecture Applications in PythonClean Architecture Applications in Python
Clean Architecture Applications in Python
 
Spring Cloud Workshop
Spring Cloud WorkshopSpring Cloud Workshop
Spring Cloud Workshop
 
애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향
 
Clean code
Clean codeClean code
Clean code
 
Kinh nghiệm triển khai Microservices tại Sapo.vn
Kinh nghiệm triển khai Microservices tại Sapo.vnKinh nghiệm triển khai Microservices tại Sapo.vn
Kinh nghiệm triển khai Microservices tại Sapo.vn
 
ABI란 무엇인가요?
ABI란 무엇인가요?ABI란 무엇인가요?
ABI란 무엇인가요?
 
Dependency Parser, 의존 구조 분석기
Dependency Parser, 의존 구조 분석기Dependency Parser, 의존 구조 분석기
Dependency Parser, 의존 구조 분석기
 
메타버스 서비스에 Android 개발자가 할 일이 있나요?
메타버스 서비스에 Android 개발자가 할 일이 있나요?메타버스 서비스에 Android 개발자가 할 일이 있나요?
메타버스 서비스에 Android 개발자가 할 일이 있나요?
 
Rest api with Python
Rest api with PythonRest api with Python
Rest api with Python
 
이미지 프로세싱 in Python Open Source - PYCON KOREA 2020
이미지 프로세싱 in Python Open Source - PYCON KOREA 2020이미지 프로세싱 in Python Open Source - PYCON KOREA 2020
이미지 프로세싱 in Python Open Source - PYCON KOREA 2020
 
Rxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaRxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJava
 
Spring + WebSocket integration
Spring + WebSocket integrationSpring + WebSocket integration
Spring + WebSocket integration
 
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
카카오 광고 플랫폼 MSA 적용 사례 및 API Gateway와 인증 구현에 대한 소개
 
Effective Java and Kotlin
Effective Java and KotlinEffective Java and Kotlin
Effective Java and Kotlin
 
Hibernate
HibernateHibernate
Hibernate
 
톰캣 운영 노하우
톰캣 운영 노하우톰캣 운영 노하우
톰캣 운영 노하우
 
JavaScript Promises
JavaScript PromisesJavaScript Promises
JavaScript Promises
 

Viewers also liked

Viewers also liked (14)

자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나
 
java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)
 
Tdd live spring camp 2013
Tdd live spring camp 2013Tdd live spring camp 2013
Tdd live spring camp 2013
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
 
스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)
스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)
스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)
 
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
 
세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화
 
세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발
 
세션1. block chain as a platform
세션1. block chain as a platform세션1. block chain as a platform
세션1. block chain as a platform
 
세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝
 

Similar to 자바8 람다식 소개

나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
daewon jeong
 
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
해강
 
Java8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJava8 - Oracle Korea Magazine
Java8 - Oracle Korea Magazine
Jay Lee
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
Sangmin Lee
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
david nc
 

Similar to 자바8 람다식 소개 (20)

Java8 람다
Java8 람다Java8 람다
Java8 람다
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
 
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
 
Java8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJava8 - Oracle Korea Magazine
Java8 - Oracle Korea Magazine
 
Functional programming
Functional programmingFunctional programming
Functional programming
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
 
자바 8 학습
자바 8 학습자바 8 학습
자바 8 학습
 
Java jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_streamJava jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_stream
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기
 
20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POP20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POP
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 

More from beom kyun choi

ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
beom kyun choi
 

More from beom kyun choi (20)

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기
 
차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회
 
Storm 훑어보기
Storm 훑어보기Storm 훑어보기
Storm 훑어보기
 
Hive 입문 발표 자료
Hive 입문 발표 자료Hive 입문 발표 자료
Hive 입문 발표 자료
 
HBase 훑어보기
HBase 훑어보기HBase 훑어보기
HBase 훑어보기
 

Recently uploaded

Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)
Wonjun Hwang
 
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
Wonjun Hwang
 

Recently uploaded (6)

오픈소스 위험 관리 및 공급망 보안 솔루션 'Checkmarx SCA' 소개자료
오픈소스 위험 관리 및 공급망 보안 솔루션 'Checkmarx SCA' 소개자료오픈소스 위험 관리 및 공급망 보안 솔루션 'Checkmarx SCA' 소개자료
오픈소스 위험 관리 및 공급망 보안 솔루션 'Checkmarx SCA' 소개자료
 
클라우드 애플리케이션 보안 플랫폼 'Checkmarx One' 소개자료
클라우드 애플리케이션 보안 플랫폼 'Checkmarx One' 소개자료클라우드 애플리케이션 보안 플랫폼 'Checkmarx One' 소개자료
클라우드 애플리케이션 보안 플랫폼 'Checkmarx One' 소개자료
 
Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)
 
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
 
[OpenLAB] AWS reInvent를 통해 바라본 글로벌 Cloud 기술동향.pdf
[OpenLAB] AWS reInvent를 통해 바라본 글로벌 Cloud 기술동향.pdf[OpenLAB] AWS reInvent를 통해 바라본 글로벌 Cloud 기술동향.pdf
[OpenLAB] AWS reInvent를 통해 바라본 글로벌 Cloud 기술동향.pdf
 
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
파일 업로드(Kitworks Team Study 유현주 발표자료 240510)
 

자바8 람다식 소개

  • 2. 자바7, 6, 5, ... Comparator<Integer> comparator = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } };
  • 4. 람다식(lambda expression) ●  단순히 정의하면, 프로그래밍에서 식별값 없이 실행 할 수 있는 함수 표현 방법 o  이미 많은 언어에서 지원: Ruby, C#, Python, o  람다식을 이용한 함수를 생성 예 §  scala: someList.filter(x => x > 0) ●  함수형(Functional) 언어에서 함수는 1급(first- level class)임 o  함수를 변수에 할당, 파라미터로 전달하는 게 가능 ●  자바는 함수가 없는데...?
  • 5. 자바8의 람다식 ●  함수형(Functional) 인터페이스의 임의 객체를 람 다식으로 표현 o  함수형 인터페이스: 추상 메서드가 1개인 인터페이스 public interface Comparator<T> { int compare(T o1, T o2); } Comparator<Long> comp = (Long o1, Long o2) -> o2 - o1 < 0 ? -1 : 1
  • 6. 람다식의 구성 (Long val1, String val2) -> val1 + val2.length() 파라미터 결과 값
  • 7. 몇 가지 람다식 예 public interface Operator<T> { public T operate(T op1, T op2); } public interface Callable<V> { V call() throws Exception; } public interface Runnable { public void run(); } public interface Predicate<T> { boolean test(T t); } // 파라미터 타입 지정 Comparator<Long> longComparator = (Long first, Long second) -> Long.compare(first, second); // 파라미터 타입 지정하지 않음, 문맥에서 유추 Comparator<Long> longComparator = (first, second) -> Long.compare(first, second); // 파라미터가 한 개인 경우, 파라미터 목록에 괄호 생략 Predicate<String> predicate = t -> t.length() > 10; // 파라미터가 없는 경우 Callable<String> callable = () -> "noparam"; // 결과 값이 없는 경우 Runnable runnable = () -> System.out.println("no return"); // 코드 블록을 사용할 경우, return을 이용해서 결과 값을 리턴 Operator<Integer> plusSquareOp = (op1, op2) -> { int result = op1 + op2; return result * result; };
  • 8. 람다식과 프리 변수 int multiple = 10; Operator<Integer> operator = (x) -> x * multiple; int result = operation( operator ); 프리 변수(free variable): 람다식의 파라미터나 식 내부에서 선언되지 않은 변수 ●  자바는 람다식에서 사용하는 프리변수의 값을 변경할 수 없음 ●  임의 객체의 경우 프리 변수를 반드시 final로 지정해야 했지만, 람다식의 경우 프리 변수의 값이 바뀌지 않으면 컴파일러가 에러를 발생하지 않음
  • 9. 몇 가지 미리 정의된 함수형 인터페이스 java.util.function 패키지에 다양한 상황 에 사용할 수 있는 함수형 인터페이스 정 의됨 public interface Function<T, R> { R apply(T t); } public interface Predicate<T> { boolean test(T t); } public interface BiFunction<T, U, R> { R apply(T t, U u); } public interface Supplier<T> { T get(); } public interface Consumer<T> { void accept(T t); }
  • 10. 함수형 인터페이스 강제 ●  @FuntionalInterface 사용 o  @FuntionalInterface가 붙은 인터페이스가 추상 메서드를 두 개 이상 가지면 컴파일 에러 발생! @FunctionalInterface public interface Operator<T> { public T operate(T op1, T op2); }
  • 11. 메서드 레퍼런스 기존 코드 public class SomeView implements OnClickListener { private void init() { myBtn.setOnClickListener(this); youBtn.setOnClickListener(this); } @Override public void onClick(ClickEvent e) { … if (e.getSource() == myBtn) { ... } } } 메서드 레퍼런스 사용 public class SomeView { private void init() { myBtn.setOnClickListener(this::onMyBtnClick); youBtn.setOnClickListener(this::onYouBtnClick); } private void onMyBtnClick(ClickEvent e) { ... } private void onYouBtnClick(ClickEvent e) { ... } }
  • 12. 메서드 레퍼런스 종류 ●  클래스::정적메서드 o  someOperation( Op::square ); §  someOperation( (x, y) -> Op.square(x, y) ); ●  객체::인스턴스메서드 o  someOperation( obj::square ); §  someOperation( (x, y) -> obj.square(x, y) ); o  someOperation( this::square ); o  someOperation( super::square ); ●  클래스::인스턴스메서드 o  someOperation( XClass::double ) §  someOperation( (x, y) -> x.double(y) )
  • 13. 인터페이스의 변화 ●  디폴트 메서드(default method) o  인터페이스 메서드가 구현을 가질 수 있음 ●  정적 메서드 o  인터페이스가 정적 메서드를 가질 수 있음
  • 14. 디폴트 메서드 public interface Collection<E> extends Iterable<E> { Iterator<E> iterator(); default boolean removeIf(Predicate<? super E> filter) { Objects.requireNonNull(filter); boolean removed = false; final Iterator<E> each = iterator(); while (each.hasNext()) { if (filter.test(each.next())) { each.remove(); removed = true; } } return removed; } LinkedList<Long> list = ….; list.removeIf((e) -> e > 10L);
  • 15. 디폴트 메서드의 우선 순위 class Team { public int version() { return 0; } } interface Verion { default int version() { return -1; } } interface Lockable { default int version() { return 1; } } class ExtTeam extends Team implements Version { } 항상 클래스가 우선순위 가짐 - ExtTeam 객체의 getVersion()은 Team 클래스의 getVersion() 사용 class Job implements Version, Lockable { @Override public int version() { return Version.super.getName() } } 상속받은 인터페이스들의 같은 시그너처 를 갖는 메서드 중 한 개라도 디폴트 메서 드가 있으면, 하위 타입에서 재정의해 주어야 함
  • 16. Optional과 람다식의 만남 ●  java.util.Optional이란? o  값이 있거나 또는 없는 경우를 표현하기 위한 클래스 o  간단한 예 §  Optional<Long> value = someMethod(); if (value.isPresent()) { Long val = value.get(); } o  map, filter 등의 고차원(higher order) 함수를 가짐 §  public<U> Optional<U> map(Function<? super T, ? extends U> mapper) §  public Optional<T> filter(Predicate<? super T> predicate) §  public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
  • 17. Optional과 람다식의 만남 ●  Optional과 고차원 함수의 조합 Optional<Member> mem = findMemberById(1L); Coord result = mem.map(Member::getAddress) .map(address -> address.getZipCode()) .map(zipCode -> findCoord(zipCode)) .orElse(null); Member mem = findMemberById(1L); Coord result = null; if (mem != null) { if (mem.getAddress() != null) { String zipCode = mem.getAddress().getZipCode(); if (zipCode != null) result = findCoord(zipCode); } }
  • 18. 기타 ●  자바8 스트림API: 함수형 인터페이스 천국 o  filter(Predicate) o  map(Function) o  sorted(Comparator) o  forEach(Consumer) o  reduce(identity, BinaryOperator) o  …