SlideShare a Scribd company logo
1 of 43
Download to read offline
Lambda expression
Javacafe 백엔드 스터디 (자바8)
목차
• 동작 파라미터로 코드 개선하기
• Lambda - 문법
• Lambda - 함수형 인터페이스
• 디폴트 메서드
• Lambda - 기본제공 함수형 인터페이스
• Lmabda - 형식검사, 추론, 제약
• Lmabda - 메서드 레퍼런스
• 실전예제 - 로깅 람다로 개선하기
• 실전예제 - 디자인패턴 람다로 변경하기
동작 파라미터로 코드 개선하기
과일 재고관리 애플리케이션을 개발
사과를 필터링하여 보여줄 수 있는 기능을 요구
요구사항
150g이상인 사과만 필터링
빨간사과와 초록사과를 분리하기
빨간색이며 150g 이상인 사과를 필터링
….
….
동작 파라미터로 코드 개선하기
초록색 사과만 필터링하기
동작 파라미터로 코드 개선하기
색상을 파라미터로 받을 수 있도록 하기
동작 파라미터로 코드 개선하기
무게를 기준으로 필터링하기
색상을 필터링하는 경우와 유사한 코드가 나타난다.
동작 파라미터로 코드 개선하기
조건을 파라미터로 직접 넣을 수 있도록 만들기
동작 파라미터로 코드 개선하기
사용시 다음과 같이 구성이 가능하다.
동작 파라미터로 코드 개선하기
ApplePredicate를 익명클래스로 구현
동작 파라미터로 코드 개선하기
익명클래스를 람다로 변환하기 - 1
동작 파라미터로 코드 개선하기
익명클래스를 람다로 변환하기 - 2
동작 파라미터로 코드 개선하기
람다 활용예 - Comparator
동작 파라미터로 코드 개선하기
람다 활용예 - Runnable
Lambda - 문법
https://ko.wikipedia.org/wiki/람다_대수
Lambda - 문법
Lambda - 문법
람다의 특성
● 익명
○ 보통의 메서드와는 달리 이름이 없다.
● 함수
○ 람다는 메서드처럼 특정 클래스에 종속되지 않는다.
파라미터 리스트, 바디, 반환 형식을 포함한다.
● 전달
○ 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수
있다.
● 간결성
○ 익명 클래스처럼 많은 부가 코드를 구현할 필요가 없다.
Lambda - 문법
Lambda - 함수형 인터페이스
● 하나의 추상 메서드를 가진 인터페이스만 람다로 사용할 수 있다.
이러한 인터페이스를 함수형 인터페이스라고 한다.
● 인터페이스 내부에 선언된 유일한 메서드에 람다의 몸체가 정의된다.
● 함수형 인터페이스에 디폴트 메서드가 여럿 있더라도,
추상 메서드가 하나라면 함수형 인터페이스이다.
● 어노테이션 @FunctionalInterface를 클래스 상단에 붙여
명시적으로 함수형 인터페이스라는 것을 표기해줄 수 있다.
Lambda - 함수형 인터페이스
• 람다는 결과적으로 함수형 인터페이스가 가지는 유일한 메서드가 구현되는 것이다.
(이를 바탕으로 타입 추론이 가능)
• 함수형 인터페이스를 인자로 가지는 게스트 코드 입장에서는 코드가 인스턴스화 되어
인자로 들어오므로 호스트 코드에서 보내는 인스턴스의 정체가 람다인지 익명클래스인
지는 관심이 없다.
• 람다와 익명클래스는 다르다.
– 익명클래스는 컴파일시 서브클래스로 별도의 파일로 컴파일되고 람다는 기존 클래
스에 포함된다.
– 람다는 바이트코드로 변환시 Java7에서 추가된 InvokeDynamic 명령어을 이용하
여 런타임에 코드가 생성된다.
Lambda - 함수형 인터페이스
• 함수형 인터페이스를 인자로 받는 메소드에만 람다식을
사용할 수 있다.
– 새로운 함수형을 추가할 경우 언어가 더 복잡해진다.
– 대부분의 자바 프로그래머가 익명클래스 문법에 익숙하다.
• 위와 같은 제약사항으로 인해 람다식의 타입 추론이 가능
해졌다.
– 함수형 인터페이스가 가지고 있는 추상 메소드가 오직 하나 밖에 없으므
로 이를 이용하여 타입 추론
– 람다식의 Prameter 추론 : 추상 메소드의 파라메터 정보
– 람다식의 Return 타입 추론 : 추상 메소드의 리턴 타입 정보
• Java8에서는 java.util.function 패키지로 다양한 함수형 인터페
이스를 제공한다.
디폴트 메서드
default 키워드를 사용하면 인터페이스에 메서드를 바로 설정 가
능
기존의 구현체 구조를 변경하지 않고도 새로운 기능을 추가 할
수 있다.
<Interface>
List
ArrayList
LinkedList
Stack
ArrayList
LinkedList
Stack
Java.util.function 패키지
Lambda - 기본제공 함수형 인터페이스
Predicate<T> T -> boolean
• Java.util.function.Predicate<T>
– 추상메소드 test()를 람다의 바디에서 정의
– T타입을 인수로 받아 Boolean을 리턴
• 입력값 T가 어떤 조건을 충족하는지 여부를 확인하는 메서드
• 어떤것이 사실인지 아닌지를 리턴해주는 람다식이 바디로 정의
Lambda - 기본제공 함수형 인터페이스
Predicate<T> T -> boolean
Lambda - 기본제공 함수형 인터페이스
Consumer<T> T -> void
• Java.util.function.Consumer<T>
– 추상메소드 accept()를 람다의 바디에서 정의
– T타입을 인수로 받고 리턴하지 않음
• 입력값 T를 받아 어떠한 동작을 수행시키는 메서드
• 람다의 바디는 특정 동작을 수행하며 반환값이 없는 형태.
Lambda - 기본제공 함수형 인터페이스
Consumer<T> T -> void
Lambda - 기본제공 함수형 인터페이스
Function<T, R> T -> R
• Java.util.function.Function<T, R>
– 추상메소드 apply()를 람다의 바디에서 정의
– T타입을 인수로 받아 R타입을 리턴
• 입력값 T를 출력값 R로 변환시키는 메소드
• 입력값을 출력값으로 매핑하는 로직이 람다의 바디에 정의된다.
Lambda - 기본제공 함수형 인터페이스
Function<T, R> T -> R
Lambda - 기본제공 함수형 인터페이스
Supplier<T> () -> T
• Java.util.function.Supplier<T>
– 추상메소드 get()를 람다의 바디에서 정의
– 인수없이 T 객체를 리턴
• 정해진 T를 공급하는 메서드
• 입력값이 없으며 람다식에 정의된 값을 결과로 반환한다.
Lambda - 기본제공 함수형 인터페이스
Supplier<T> () -> T
Lambda - 기본제공 함수형 인터페이스
람다 표현식 조합
• Java.util.function 패키지에서 제공하는 함수형 인터페이
스 중 일부는 static 메소드 형태의 유틸리티 메소드를 가
지고 있다.
– Predicate
– Function
• 유틸리티 메서드를 조합해서 복잡한 로직을 보다 간결하
게 표현할 수 있다.
Lambda - 기본제공 함수형 인터페이스
Lambda - 기본제공 함수형 인터페이스
Lambda - 기본제공 함수형 인터페이스
Lambda - 기본제공 함수형 인터페이스
오토박싱 비용을 줄일수 있도록 Java8은 기본형 특화 함수형 인터페이스를 제
공한다.
Lambda - 메서드 레퍼런스
람다를 간결하게 쓸 수 있도록 도와주는 문법
클래스(객체)명과 메서드명 사이에 구분자(::)를 붙여 사용한다.
Lambda - 메서드 레퍼런스
종류 형식
정적 메서드 참조 클래스명::정적메서드명
객체 메서드 참조 객체변수::메서드명
람다인자 객체 메서드 참
조
클래스명::메서드명
생성자 참조 클래스명::new
메서드 레퍼런스의 종류
Lambda - 메서드 레퍼런스
정적 메서드 참조
Function<String, Integer> toNumber1 = (str) -> Integer.parseInt(str);
Function<String, Integer> toNumber2 = Integer::parseInt;
• 클래스 내부에 정의된 정적메서드 호출을 표현할 수 있다.
– (인자) -> 클래스.정적메서드(인자)
– 클래스::정적메서드
Lambda - 메서드 레퍼런스
객체 메서드 참조
• 객체의 인스턴스 메서드 호출을 표현할 수 있다.
– (인자) -> 객체.인스턴스메서드(인자)
– 객체::인스턴스메서드
Consumer<String> out1 = (str) -> System.out.println(str);
Consumer<String> out2 = System.out::println;
Comparator<Integer> comp1 = (o1, o2) -> o1.compareTo(o2);
Comparator<Integer> comp2 = Integer::compareTo;
Lambda - 메서드 레퍼런스
람다인자 객체 메서드 참조
• 람다인자객체의 인스턴스 메서드 호출을 간결하게 표현
– (인자1, 인자2) -> 인자1.메서드(인자2)
– 인자1의클래스명::메서드명
Lambda - 메서드 레퍼런스
생성자 참조
• 클래스의 생성자를 간결하게 호출할 수 있다.
– (인자) -> new 클래스(인자), () -> new 클래스()
– 클래스::new
Supplier<String> int1 = () -> new String();
Supplier<String> int2 = String::new;
Stream?!?!!
Stream!!!!!
요약
● 람다 표현식은 익명클래스를 간결하게 표현할 수 있다.
(약간은 달라요.)
● 함수형 인터페이스는 하나의 추상 메서드만이 정의된 인터페이
스
● 자바에서는 자주 사용되는 기본적인 형태의 함수형 인터페이스
를 제공
● 기본제공되는 함수형 인터페이스는 Boxing을 피할 수 있도록
IntPredicate, IntToLongFunction과 같은 primitive타입의 인터
페이스 제공
● 메서드 레퍼런스를 이용하면 기존의 메서드 구현을 재사용 및 전
달 가능
● Comparator, Predicate, Function 같은 함수형 인터페이스는
람다 표현식을 조합할 수 있는 다양한 디폴트 메서드를 제공

More Related Content

What's hot

나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
daewon jeong
 

What's hot (19)

Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
 
3. stream api
3. stream api3. stream api
3. stream api
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
자바8 람다 나머지 공개
자바8 람다 나머지 공개자바8 람다 나머지 공개
자바8 람다 나머지 공개
 
JavaInAction 자바 8
JavaInAction 자바 8JavaInAction 자바 8
JavaInAction 자바 8
 
Scala 기초 (2)
Scala 기초 (2)Scala 기초 (2)
Scala 기초 (2)
 
Scala 기초 (4)
Scala 기초 (4)Scala 기초 (4)
Scala 기초 (4)
 
씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 API씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 API
 
러닝스칼라 - Scala 기초 (1)
러닝스칼라 - Scala 기초 (1)러닝스칼라 - Scala 기초 (1)
러닝스칼라 - Scala 기초 (1)
 
Just java
Just javaJust java
Just java
 
1. introduction to java8
1. introduction to java81. introduction to java8
1. introduction to java8
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
발표자료 11장
발표자료 11장발표자료 11장
발표자료 11장
 
Java lambda
Java lambdaJava lambda
Java lambda
 
java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰
 
Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405
 
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
 

Viewers also liked

Viewers also liked (16)

ProjectEuler 소개 및 활용법
ProjectEuler 소개 및 활용법ProjectEuler 소개 및 활용법
ProjectEuler 소개 및 활용법
 
2. lambda expression
2. lambda expression2. lambda expression
2. lambda expression
 
Java 8 - New Updates and Why It Matters?
Java 8 - New Updates and Why It Matters?Java 8 - New Updates and Why It Matters?
Java 8 - New Updates and Why It Matters?
 
안드로이드를 위한 Gradle 맛들이기
안드로이드를 위한 Gradle 맛들이기안드로이드를 위한 Gradle 맛들이기
안드로이드를 위한 Gradle 맛들이기
 
백엔드 스터디 2주
백엔드 스터디 2주백엔드 스터디 2주
백엔드 스터디 2주
 
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
 
DevOps!! 도데체 왜, 어떻게 할까??
DevOps!! 도데체 왜, 어떻게 할까??DevOps!! 도데체 왜, 어떻게 할까??
DevOps!! 도데체 왜, 어떻게 할까??
 
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
 
엘라스틱서치 분석 이해하기 20160623
엘라스틱서치 분석 이해하기 20160623엘라스틱서치 분석 이해하기 20160623
엘라스틱서치 분석 이해하기 20160623
 
5. 솔루션 카달로그
5. 솔루션 카달로그5. 솔루션 카달로그
5. 솔루션 카달로그
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.js
 
1. 아키텍쳐 설계 프로세스
1. 아키텍쳐 설계 프로세스1. 아키텍쳐 설계 프로세스
1. 아키텍쳐 설계 프로세스
 
오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기
 
알파고 (바둑 인공지능)의 작동 원리
알파고 (바둑 인공지능)의 작동 원리알파고 (바둑 인공지능)의 작동 원리
알파고 (바둑 인공지능)의 작동 원리
 
기계학습 / 딥러닝이란 무엇인가
기계학습 / 딥러닝이란 무엇인가기계학습 / 딥러닝이란 무엇인가
기계학습 / 딥러닝이란 무엇인가
 
REST API 설계
REST API 설계REST API 설계
REST API 설계
 

Similar to 자바8강의 1강. lambda expression

Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
현찬 양
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
Sangmin Lee
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2
destinycs
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
Min-soo Park
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
Sung-hoon Ma
 

Similar to 자바8강의 1강. lambda expression (20)

Java_10 람다
Java_10 람다Java_10 람다
Java_10 람다
 
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
C# 개요 및 소개 [ 유니티 및 C# 스터디 / 2024-04-19 ]
 
조리돌림 JAVA8 기반의 기능.pptx
조리돌림 JAVA8 기반의 기능.pptx조리돌림 JAVA8 기반의 기능.pptx
조리돌림 JAVA8 기반의 기능.pptx
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식
 
PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기
 
자바 8
자바 8자바 8
자바 8
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
Scala 기초 (3)
Scala 기초 (3)Scala 기초 (3)
Scala 기초 (3)
 
[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략[15]Android Kotlin을 통한 개발 전략
[15]Android Kotlin을 통한 개발 전략
 
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
이것이 자바다 Chap.14 람다식 Lambda expression(java)(KOR)
 
Linq
LinqLinq
Linq
 
람다, 스트림 Api
람다, 스트림 Api람다, 스트림 Api
람다, 스트림 Api
 
Java jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_streamJava jungsuk3 ch14_lambda_stream
Java jungsuk3 ch14_lambda_stream
 
자바와 사용하기2
자바와 사용하기2자바와 사용하기2
자바와 사용하기2
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework
 
Scala implicit
Scala implicitScala implicit
Scala implicit
 

자바8강의 1강. lambda expression

  • 2. 목차 • 동작 파라미터로 코드 개선하기 • Lambda - 문법 • Lambda - 함수형 인터페이스 • 디폴트 메서드 • Lambda - 기본제공 함수형 인터페이스 • Lmabda - 형식검사, 추론, 제약 • Lmabda - 메서드 레퍼런스 • 실전예제 - 로깅 람다로 개선하기 • 실전예제 - 디자인패턴 람다로 변경하기
  • 3. 동작 파라미터로 코드 개선하기 과일 재고관리 애플리케이션을 개발 사과를 필터링하여 보여줄 수 있는 기능을 요구 요구사항 150g이상인 사과만 필터링 빨간사과와 초록사과를 분리하기 빨간색이며 150g 이상인 사과를 필터링 …. ….
  • 4. 동작 파라미터로 코드 개선하기 초록색 사과만 필터링하기
  • 5. 동작 파라미터로 코드 개선하기 색상을 파라미터로 받을 수 있도록 하기
  • 6. 동작 파라미터로 코드 개선하기 무게를 기준으로 필터링하기 색상을 필터링하는 경우와 유사한 코드가 나타난다.
  • 7. 동작 파라미터로 코드 개선하기 조건을 파라미터로 직접 넣을 수 있도록 만들기
  • 8. 동작 파라미터로 코드 개선하기 사용시 다음과 같이 구성이 가능하다.
  • 9. 동작 파라미터로 코드 개선하기 ApplePredicate를 익명클래스로 구현
  • 10. 동작 파라미터로 코드 개선하기 익명클래스를 람다로 변환하기 - 1
  • 11. 동작 파라미터로 코드 개선하기 익명클래스를 람다로 변환하기 - 2
  • 12. 동작 파라미터로 코드 개선하기 람다 활용예 - Comparator
  • 13. 동작 파라미터로 코드 개선하기 람다 활용예 - Runnable
  • 16. Lambda - 문법 람다의 특성 ● 익명 ○ 보통의 메서드와는 달리 이름이 없다. ● 함수 ○ 람다는 메서드처럼 특정 클래스에 종속되지 않는다. 파라미터 리스트, 바디, 반환 형식을 포함한다. ● 전달 ○ 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. ● 간결성 ○ 익명 클래스처럼 많은 부가 코드를 구현할 필요가 없다.
  • 18. Lambda - 함수형 인터페이스 ● 하나의 추상 메서드를 가진 인터페이스만 람다로 사용할 수 있다. 이러한 인터페이스를 함수형 인터페이스라고 한다. ● 인터페이스 내부에 선언된 유일한 메서드에 람다의 몸체가 정의된다. ● 함수형 인터페이스에 디폴트 메서드가 여럿 있더라도, 추상 메서드가 하나라면 함수형 인터페이스이다. ● 어노테이션 @FunctionalInterface를 클래스 상단에 붙여 명시적으로 함수형 인터페이스라는 것을 표기해줄 수 있다.
  • 19. Lambda - 함수형 인터페이스 • 람다는 결과적으로 함수형 인터페이스가 가지는 유일한 메서드가 구현되는 것이다. (이를 바탕으로 타입 추론이 가능) • 함수형 인터페이스를 인자로 가지는 게스트 코드 입장에서는 코드가 인스턴스화 되어 인자로 들어오므로 호스트 코드에서 보내는 인스턴스의 정체가 람다인지 익명클래스인 지는 관심이 없다. • 람다와 익명클래스는 다르다. – 익명클래스는 컴파일시 서브클래스로 별도의 파일로 컴파일되고 람다는 기존 클래 스에 포함된다. – 람다는 바이트코드로 변환시 Java7에서 추가된 InvokeDynamic 명령어을 이용하 여 런타임에 코드가 생성된다.
  • 20. Lambda - 함수형 인터페이스 • 함수형 인터페이스를 인자로 받는 메소드에만 람다식을 사용할 수 있다. – 새로운 함수형을 추가할 경우 언어가 더 복잡해진다. – 대부분의 자바 프로그래머가 익명클래스 문법에 익숙하다. • 위와 같은 제약사항으로 인해 람다식의 타입 추론이 가능 해졌다. – 함수형 인터페이스가 가지고 있는 추상 메소드가 오직 하나 밖에 없으므 로 이를 이용하여 타입 추론 – 람다식의 Prameter 추론 : 추상 메소드의 파라메터 정보 – 람다식의 Return 타입 추론 : 추상 메소드의 리턴 타입 정보 • Java8에서는 java.util.function 패키지로 다양한 함수형 인터페 이스를 제공한다.
  • 21. 디폴트 메서드 default 키워드를 사용하면 인터페이스에 메서드를 바로 설정 가 능 기존의 구현체 구조를 변경하지 않고도 새로운 기능을 추가 할 수 있다. <Interface> List ArrayList LinkedList Stack ArrayList LinkedList Stack
  • 22. Java.util.function 패키지 Lambda - 기본제공 함수형 인터페이스
  • 23. Predicate<T> T -> boolean • Java.util.function.Predicate<T> – 추상메소드 test()를 람다의 바디에서 정의 – T타입을 인수로 받아 Boolean을 리턴 • 입력값 T가 어떤 조건을 충족하는지 여부를 확인하는 메서드 • 어떤것이 사실인지 아닌지를 리턴해주는 람다식이 바디로 정의 Lambda - 기본제공 함수형 인터페이스
  • 24. Predicate<T> T -> boolean Lambda - 기본제공 함수형 인터페이스
  • 25. Consumer<T> T -> void • Java.util.function.Consumer<T> – 추상메소드 accept()를 람다의 바디에서 정의 – T타입을 인수로 받고 리턴하지 않음 • 입력값 T를 받아 어떠한 동작을 수행시키는 메서드 • 람다의 바디는 특정 동작을 수행하며 반환값이 없는 형태. Lambda - 기본제공 함수형 인터페이스
  • 26. Consumer<T> T -> void Lambda - 기본제공 함수형 인터페이스
  • 27. Function<T, R> T -> R • Java.util.function.Function<T, R> – 추상메소드 apply()를 람다의 바디에서 정의 – T타입을 인수로 받아 R타입을 리턴 • 입력값 T를 출력값 R로 변환시키는 메소드 • 입력값을 출력값으로 매핑하는 로직이 람다의 바디에 정의된다. Lambda - 기본제공 함수형 인터페이스
  • 28. Function<T, R> T -> R Lambda - 기본제공 함수형 인터페이스
  • 29. Supplier<T> () -> T • Java.util.function.Supplier<T> – 추상메소드 get()를 람다의 바디에서 정의 – 인수없이 T 객체를 리턴 • 정해진 T를 공급하는 메서드 • 입력값이 없으며 람다식에 정의된 값을 결과로 반환한다. Lambda - 기본제공 함수형 인터페이스
  • 30. Supplier<T> () -> T Lambda - 기본제공 함수형 인터페이스
  • 31. 람다 표현식 조합 • Java.util.function 패키지에서 제공하는 함수형 인터페이 스 중 일부는 static 메소드 형태의 유틸리티 메소드를 가 지고 있다. – Predicate – Function • 유틸리티 메서드를 조합해서 복잡한 로직을 보다 간결하 게 표현할 수 있다. Lambda - 기본제공 함수형 인터페이스
  • 32. Lambda - 기본제공 함수형 인터페이스
  • 33. Lambda - 기본제공 함수형 인터페이스
  • 34. Lambda - 기본제공 함수형 인터페이스 오토박싱 비용을 줄일수 있도록 Java8은 기본형 특화 함수형 인터페이스를 제 공한다.
  • 35. Lambda - 메서드 레퍼런스 람다를 간결하게 쓸 수 있도록 도와주는 문법 클래스(객체)명과 메서드명 사이에 구분자(::)를 붙여 사용한다.
  • 36. Lambda - 메서드 레퍼런스 종류 형식 정적 메서드 참조 클래스명::정적메서드명 객체 메서드 참조 객체변수::메서드명 람다인자 객체 메서드 참 조 클래스명::메서드명 생성자 참조 클래스명::new 메서드 레퍼런스의 종류
  • 37. Lambda - 메서드 레퍼런스 정적 메서드 참조 Function<String, Integer> toNumber1 = (str) -> Integer.parseInt(str); Function<String, Integer> toNumber2 = Integer::parseInt; • 클래스 내부에 정의된 정적메서드 호출을 표현할 수 있다. – (인자) -> 클래스.정적메서드(인자) – 클래스::정적메서드
  • 38. Lambda - 메서드 레퍼런스 객체 메서드 참조 • 객체의 인스턴스 메서드 호출을 표현할 수 있다. – (인자) -> 객체.인스턴스메서드(인자) – 객체::인스턴스메서드 Consumer<String> out1 = (str) -> System.out.println(str); Consumer<String> out2 = System.out::println;
  • 39. Comparator<Integer> comp1 = (o1, o2) -> o1.compareTo(o2); Comparator<Integer> comp2 = Integer::compareTo; Lambda - 메서드 레퍼런스 람다인자 객체 메서드 참조 • 람다인자객체의 인스턴스 메서드 호출을 간결하게 표현 – (인자1, 인자2) -> 인자1.메서드(인자2) – 인자1의클래스명::메서드명
  • 40. Lambda - 메서드 레퍼런스 생성자 참조 • 클래스의 생성자를 간결하게 호출할 수 있다. – (인자) -> new 클래스(인자), () -> new 클래스() – 클래스::new Supplier<String> int1 = () -> new String(); Supplier<String> int2 = String::new;
  • 43. 요약 ● 람다 표현식은 익명클래스를 간결하게 표현할 수 있다. (약간은 달라요.) ● 함수형 인터페이스는 하나의 추상 메서드만이 정의된 인터페이 스 ● 자바에서는 자주 사용되는 기본적인 형태의 함수형 인터페이스 를 제공 ● 기본제공되는 함수형 인터페이스는 Boxing을 피할 수 있도록 IntPredicate, IntToLongFunction과 같은 primitive타입의 인터 페이스 제공 ● 메서드 레퍼런스를 이용하면 기존의 메서드 구현을 재사용 및 전 달 가능 ● Comparator, Predicate, Function 같은 함수형 인터페이스는 람다 표현식을 조합할 수 있는 다양한 디폴트 메서드를 제공