함수형 인터페이스 란?
- 추상 메서드가 하나인 인터페이스
- 추상 메서드가 하나란 말은 다른 메서드는 있어도 된다는 의미
- default 메서드나, static 메서드는 있어도 된다~
함수형 인터페이스로 쓸때 @FunctionalInterface 어노테이션을 붙여주면
함수형 인터페이스 요건에 어긋나는 경우 잘못됐다고 말해준다.
왜, 어디에 쓰면 좋은가?
- 구현해야 하는 추상 메서드가 하나이면 람다 표현식으로 코드를 줄일 수 있다.
- 함수를 매개변수(파라미터, 반환값)으로 전달할 수 있다.
사용법
단축키: control + .(점)
점을 누르거나 전구를 클릭하면 Convert to lambda expression이라고 뜬다.
자바에서 기본 제공하는 인터페이스
함수를 만들어서 쓸 수 있다.
인터페이스를 쓰면 함수를 조합할 수 있다. (고차함수는 변수로 사용할 수 있기 때문)
함수 체인이랑은 조금 느낌이 다르다.
docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
Interface | Description |
Function<T,R> |
Represents a function that accepts one argument and produces a result. |
BiFunction<T,U,R> |
Represents a function that accepts two arguments and produces a result. |
Consumer<T> |
Represents an operation that accepts a single input argument and returns no result. |
Supplier<T> |
Represents a supplier of results. |
Predicate<T> |
Represents a predicate (boolean-valued function) of one argument. |
BinaryOperator<T> |
Represents an operation upon two operands of the same type, producing a result of the same type as the operands. |
UnaryOperator<T> |
Represents an operation on a single operand that produces a result of the same type as its operand. |
함수 이어붙이기
1. Predicator
Modifier and Type | Method and Description |
default Predicate<T> | and(Predicate<? super T> other)
Returns a composed predicate that represents a short-circuiting logical AND of this predicate and another. |
static <T> Predicate<T> | isEqual(Object targetRef)
Returns a predicate that tests if two arguments are equal according to Objects.equals(Object, Object). |
default Predicate<T> | negate()
Returns a predicate that represents the logical negation of this predicate. |
default Predicate<T> | or(Predicate<? super T> other)
Returns a composed predicate that represents a short-circuiting logical OR of this predicate and another. |
boolean | test(T t)
Evaluates this predicate on the given argument. |
2. Function
Modifier and Type | Method and Description |
default <V> Function<T,V> | andThen(Function<? super R,? extends V> after)
Returns a composed function that first applies this function to its input, and then applies the after function to the result. |
R | apply(T t)
Applies this function to the given argument. |
default <V> Function<V,R> | compose(Function<? super V,? extends T> before)
Returns a composed function that first applies the before function to its input, and then applies this function to the result. |
static <T> Function<T,T> | identity()
Returns a function that always returns its input argument. |
Variable Capture
- 익명 클래스에서는 외부 변수를 참조하는것을 Variable Capture라고 한다.
- final이거나 effective final인 경우에만 참조할 수 있다.
effective final
- 이것도 역시 자바 8부터 지원하는 기능으로 “사실상" final인 변수.
- 사실상 final이라는 것은 초기화하고 바꾸지 않은 경우
- 편의상 제공하는거 같은데 그냥 final 쓰는게 맞다.
Shadowing
- 로컬 클래스, 익명 클래스와 람다가 다른 점
- 람다는 쉐도윙을 하지 않는다.
- 쉐도윙이란 바깥 스코프와 같은 이름이 있으면 안에거가 밖에거를 가려버리는 것
- 람다는 스콥이 없다. 스콥이 자신이 포함된 블록과 같다.
docs.oracle.com/javase/tutorial/java/javaOO/nested.html#shadowing
메서드 레퍼런스
- 이 문법으로 메서드를 매우 쉽게 뽑아낼 수 있다.
- 클래스::스태틱메서드 / 인스턴스::메서드 / 클래스::new 같은 식으로 메서드를 뽑아낼 수 있다.
- 자바8에서 Compare 인터페이스도 함수형 인터페이스로 변경되어서 비교, 정렬할때 활용 가능
'백엔드 > Java' 카테고리의 다른 글
Collectors.groupingBy 널(null) 키 사용하기 (1) | 2021.03.08 |
---|---|
Optional (0) | 2021.03.07 |
멀티스레드 처리 (0) | 2020.12.07 |
JSON Enum 파싱 (0) | 2020.11.10 |
JSON 문자열 List 타입 파싱할때 LinkedHashMap으로 변환되는 문제 (1) | 2020.09.26 |
댓글