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

MySQL Performance Schema in Action: the Complete Tutorial
MySQL Performance Schema in Action: the Complete TutorialMySQL Performance Schema in Action: the Complete Tutorial
MySQL Performance Schema in Action: the Complete TutorialSveta Smirnova
 
Percona Live 2022 - The Evolution of a MySQL Database System
Percona Live 2022 - The Evolution of a MySQL Database SystemPercona Live 2022 - The Evolution of a MySQL Database System
Percona Live 2022 - The Evolution of a MySQL Database SystemFrederic Descamps
 
MySQL Indexing : Improving Query Performance Using Index (Covering Index)
MySQL Indexing : Improving Query Performance Using Index (Covering Index)MySQL Indexing : Improving Query Performance Using Index (Covering Index)
MySQL Indexing : Improving Query Performance Using Index (Covering Index)Hemant Kumar Singh
 
AWS 환경에서 MySQL BMT
AWS 환경에서 MySQL BMTAWS 환경에서 MySQL BMT
AWS 환경에서 MySQL BMTI Goo Lee
 
MySQL Index Cookbook
MySQL Index CookbookMySQL Index Cookbook
MySQL Index CookbookMYXPLAIN
 
[243]kaleido 노현걸
[243]kaleido 노현걸[243]kaleido 노현걸
[243]kaleido 노현걸NAVER D2
 
InnoDB Internal
InnoDB InternalInnoDB Internal
InnoDB Internalmysqlops
 
Reproducible AI using MLflow and PyTorch
Reproducible AI using MLflow and PyTorchReproducible AI using MLflow and PyTorch
Reproducible AI using MLflow and PyTorchDatabricks
 
MySQL Performance Tuning: Top 10 Tips
MySQL Performance Tuning: Top 10 TipsMySQL Performance Tuning: Top 10 Tips
MySQL Performance Tuning: Top 10 TipsOSSCube
 
The MySQL Query Optimizer Explained Through Optimizer Trace
The MySQL Query Optimizer Explained Through Optimizer TraceThe MySQL Query Optimizer Explained Through Optimizer Trace
The MySQL Query Optimizer Explained Through Optimizer Traceoysteing
 
도메인 주도 설계의 본질
도메인 주도 설계의 본질도메인 주도 설계의 본질
도메인 주도 설계의 본질Young-Ho Cho
 
MariaDB 10.11 key features overview for DBAs
MariaDB 10.11 key features overview for DBAsMariaDB 10.11 key features overview for DBAs
MariaDB 10.11 key features overview for DBAsFederico Razzoli
 
[수정본] 우아한 객체지향
[수정본] 우아한 객체지향[수정본] 우아한 객체지향
[수정본] 우아한 객체지향Young-Ho Cho
 
Docker Networking - Common Issues and Troubleshooting Techniques
Docker Networking - Common Issues and Troubleshooting TechniquesDocker Networking - Common Issues and Troubleshooting Techniques
Docker Networking - Common Issues and Troubleshooting TechniquesSreenivas Makam
 
Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Younghan Kim
 
The Volcano/Cascades Optimizer
The Volcano/Cascades OptimizerThe Volcano/Cascades Optimizer
The Volcano/Cascades Optimizer宇 傅
 
MySQL 8.0 EXPLAIN ANALYZE
MySQL 8.0 EXPLAIN ANALYZEMySQL 8.0 EXPLAIN ANALYZE
MySQL 8.0 EXPLAIN ANALYZENorvald Ryeng
 
Add Redis to Postgres to Make Your Microservices Go Boom!
Add Redis to Postgres to Make Your Microservices Go Boom!Add Redis to Postgres to Make Your Microservices Go Boom!
Add Redis to Postgres to Make Your Microservices Go Boom!Dave Nielsen
 
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스NAVER D2
 

What's hot (20)

Percona toolkit
Percona toolkitPercona toolkit
Percona toolkit
 
MySQL Performance Schema in Action: the Complete Tutorial
MySQL Performance Schema in Action: the Complete TutorialMySQL Performance Schema in Action: the Complete Tutorial
MySQL Performance Schema in Action: the Complete Tutorial
 
Percona Live 2022 - The Evolution of a MySQL Database System
Percona Live 2022 - The Evolution of a MySQL Database SystemPercona Live 2022 - The Evolution of a MySQL Database System
Percona Live 2022 - The Evolution of a MySQL Database System
 
MySQL Indexing : Improving Query Performance Using Index (Covering Index)
MySQL Indexing : Improving Query Performance Using Index (Covering Index)MySQL Indexing : Improving Query Performance Using Index (Covering Index)
MySQL Indexing : Improving Query Performance Using Index (Covering Index)
 
AWS 환경에서 MySQL BMT
AWS 환경에서 MySQL BMTAWS 환경에서 MySQL BMT
AWS 환경에서 MySQL BMT
 
MySQL Index Cookbook
MySQL Index CookbookMySQL Index Cookbook
MySQL Index Cookbook
 
[243]kaleido 노현걸
[243]kaleido 노현걸[243]kaleido 노현걸
[243]kaleido 노현걸
 
InnoDB Internal
InnoDB InternalInnoDB Internal
InnoDB Internal
 
Reproducible AI using MLflow and PyTorch
Reproducible AI using MLflow and PyTorchReproducible AI using MLflow and PyTorch
Reproducible AI using MLflow and PyTorch
 
MySQL Performance Tuning: Top 10 Tips
MySQL Performance Tuning: Top 10 TipsMySQL Performance Tuning: Top 10 Tips
MySQL Performance Tuning: Top 10 Tips
 
The MySQL Query Optimizer Explained Through Optimizer Trace
The MySQL Query Optimizer Explained Through Optimizer TraceThe MySQL Query Optimizer Explained Through Optimizer Trace
The MySQL Query Optimizer Explained Through Optimizer Trace
 
도메인 주도 설계의 본질
도메인 주도 설계의 본질도메인 주도 설계의 본질
도메인 주도 설계의 본질
 
MariaDB 10.11 key features overview for DBAs
MariaDB 10.11 key features overview for DBAsMariaDB 10.11 key features overview for DBAs
MariaDB 10.11 key features overview for DBAs
 
[수정본] 우아한 객체지향
[수정본] 우아한 객체지향[수정본] 우아한 객체지향
[수정본] 우아한 객체지향
 
Docker Networking - Common Issues and Troubleshooting Techniques
Docker Networking - Common Issues and Troubleshooting TechniquesDocker Networking - Common Issues and Troubleshooting Techniques
Docker Networking - Common Issues and Troubleshooting Techniques
 
Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조
 
The Volcano/Cascades Optimizer
The Volcano/Cascades OptimizerThe Volcano/Cascades Optimizer
The Volcano/Cascades Optimizer
 
MySQL 8.0 EXPLAIN ANALYZE
MySQL 8.0 EXPLAIN ANALYZEMySQL 8.0 EXPLAIN ANALYZE
MySQL 8.0 EXPLAIN ANALYZE
 
Add Redis to Postgres to Make Your Microservices Go Boom!
Add Redis to Postgres to Make Your Microservices Go Boom!Add Redis to Postgres to Make Your Microservices Go Boom!
Add Redis to Postgres to Make Your Microservices Go Boom!
 
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
 

Viewers also liked

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

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
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)MIN SEOK KOO
 
[아꿈사] 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 MagazineJay Lee
 
Functional programming
Functional programmingFunctional programming
Functional programmingssuserdcfefa
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3david nc
 
Java jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_streamJava jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_stream성 남궁
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기 Yong Joon Moon
 
20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POP20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POPChiwon Song
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Circulus
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)JiandSon
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 
[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 SummaryChris Ohk
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Park Jonggun
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10흥배 최
 

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

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

More from beom kyun choi (20)

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
 
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 입문 발표 자료
 

자바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  …