티스토리 뷰
오늘은 자바 람다식에 대해 공부를 했다.
내가 읽고 공부한 책은 이것이 자바다 신용권의 Java 프로그래밍 정복이라는 책이며 오늘 공부하면서 배운 내용을 정리 하려고 한다.
람다식이란?
- 자바는 함수적 프로그래밍을 위해 자바 8부터 람다식을 지원하기 시작했다.
- 람다식은 익명 함수(anonymous function)를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다.
- 람다식의 형태는 매개 변수를 가진 코드 블록이지만, 런타임 시에는 익명 구현 객체를 생성한다.
람다식 기본 문법
// 람다식은 일반적으로 매개변수 타입을 언급하지 않는다.
(a) -> {System.out.println(a);}
// 매개변수가 하나고 실행문도 하나
a -> System.out.println(a)
// 리턴값이 있는 경우
(x, y) -> {return x + y;}
// 중괄호 {}에 return문만 있을 경우, return문 생략 가능
(x, y) -> x + y
타겟 타입과 함수적 인터페이스
인터페이스 변수 = 람다식;
람다식은 인터페이스 변수에 대입된다.
람다식이 대입될 인터페이스를 람다식의 타겟 타입(target type)이라고 한다.
함수적 인터페이스(@FunctionalInterface)
- 추상 메소드를 하나만 선언된 인터페이스를 함수적 인터페이스라고 한다.
- 디폴트 및 정적 메소드는 추상 메소드가 아니기 때문에 함수적 인터페이스에 선언되어도 함수적 인터페이스의 성질을 잃지 않는다.
- @FunctionalInterface 어노테이션은 선택사항이다. 하나의 추상 메소드만 있으면 기본적으로 함수적 인터페이스 이므로 실수로 두 개 이상의 추상 메소드를 선언하는 것을 방지하려면 @FunctionalInterface 어노테이션을 추가하자.
표준 API의 함수적 인터페이스
자바 8부터 함수적 인터페이스는 java.util.function 표준 API 패키지로 제공한다.
종류 | 추상 메소드 특징 | |
Consumer | - 매개값은 있고, 리턴값은 없음 | 매개값 -> [Consumer] |
Supplier | - 매개값은 없고, 리턴값은 있음 | [Supplier] -> 리턴값 |
Function | - 매개값도 있고, 리턴값도 있음 - 주로 매개값을 리턴값으로 매핑(타입 변환) |
매개값 -> [Function] -> 리턴값 |
Operator | - 매개값도 있고, 리턴값도 있음 - 주로 매개값을 연산하고 결과를 리턴 |
매개값 -> [Operator] -> 리턴값 |
Predicate | - 매개값은 있고, 리턴 타입은 boolean - 매개값을 조사해서 true/false를 리턴 |
매개값 -> [Predicate] -> boolean |
andThen()과 compose() 티폴트 메소드
andThen()과 compose() 메소드는 두 개의 함수적 인터페이스를 순차적으로 연결하고, 첫 번째 처리 결과를 두 번째 매개값으로 제공해서 최종 결과값을 얻을 때 사용한다.
- andThen()
인터페이스AB = 인터페이스A.andThen(인터페이스B);
최종결과 = 인터페이스AB.method();
- compose()
인터페이스AB = 인터페이스A.compose(인터페이스B);
최종결과 = 인터페이스AB.method();
and(), or(), negate() 디폴트 메소드와 isEqual() 정적 메소드
- Preidcate 종류의 함수적 인터페이스는 각각 &&, ||, !과 대응되는 and(), or(), negate() 디폴트 메소드를 가지고 있다.
- isEqual() 메소드는 test() 매개값인 sourceObject와 isEqual()의 매개값인 targetObject를 java.util.Objects 클래스의 equals()의 매개값으로 제공하고, Objects.equals(sourceObject, targetObject)의 리턴값을 얻어 새로운 Predicate<T>를 생성한다.
Predicate<Object> predicate = Predicate.isEqual(targetObject);
boolean result = predicate.test(sourceObject);
minBy(), maxBy() 정적 메소드
BinaryOperator<T> 함수적 인터페이스는 minBy(), maxBy() 정적 메소드를 제공한다.
리턴 타입 | 정적 메소드 |
BinaryOperator<T> | minBy(Comparator<? super T> comparator) |
BinaryOperator<T> | maxBy(Comparator<? super T> comparator) |
메소드 참조
// 메소드 참조를 이용해서 줄일 수 있다.
// (left, right) -> Math.max(left, right);
Math::max;
// 정적 메소드 참조할 경우
클래스::메소드
// 인스턴스 메소드
참조변수::메소드
// 매개 변수의 메소드 참조
// (a, b) -> {a.instanceMethod(b);}
a::instanceMethod
// 생성자 참조
// (a, b) -> {return new 클래스(a, b);}
클래스::new
'TIL' 카테고리의 다른 글
GitHub 기본 패스워드 인증 (0) | 2021.02.15 |
---|---|
스프링 시큐리티(Spring Security) 간단 정리 (0) | 2021.02.09 |
자바(Java) 스레드(Thread) 공부 (0) | 2021.02.07 |
스프링 어노테이션에 대해 알게 된 사실 (0) | 2021.02.05 |
타임리프(Thymeleaf)에 대해 (0) | 2021.02.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- framework
- Gson
- 충돌에러
- Set
- git
- 데이터베이스
- bootstrap
- IntelliJ
- 도커
- IDE
- 이클립스
- Jackson
- 인텔리제이
- rbenv
- JSON
- Github
- interface
- Spring
- EC2
- 스트림
- gem
- 타임리프
- Docker
- optional
- Thymeleaf
- java
- 유효성 검사
- homebrew
- Stream
- S3
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함