클로저
원래는 자유변수였다가 특정함수에 고정
함수가 반환값일 때 가능

ㄴ 인터페이스가 객체가 되는 조건 사용
ㄴ 너무 길어!

ㄴ 형식 단순화 : 람다식

함수
- 자바에서함수는 함수⭕
ㄴ 값으로 쓰일 수❌
ㄴ 함수 : 실행절차 및 재료가 나열된 코드에 불과 -> 객체가 되야 값으로 쓰일 수 있다
-> 자바에서는 함수가 값으로 쓰일 수 없어서 함수형프로그래밍에 쓸 수❌
-> 인터페이스가 객체가 되는 조건을 이용해서 함수형프로그래밍 사용가능하게끔 흉내냄
-> 근데 이 식이 너무 길고, 용도가 제한적이므로 단순화하자 : 람다식
- 자바스크립트에서 함수는 함수가❌
함수형프로그래밍 사용
ㄴ 값으로 쓰일 수⭕
ㄴ 함수가 객체이다
2) 매개변수 정의 부분과 함수 구현 부분({ }) 사이에 -> 추가
3) 매개변수의 자료형 생략 가능
4) 구현코드가 한줄일때는 { ... } 생략 가능, return 예약어도 생략 해야 된다.
5) 최대한 짧게 쓰는 방향(변수명도 한 글자로 하는 것이 권장)



ㄴ 인터페이스 정의로 유추가능하니 자료형 생략가능

ㄴ 코드가 1줄이면 {}도 생략가능
ㄴ 인터페이스 정의 보니까 void 아니네
ㄴ return이 있을거 예상되니 생략

ㄴ 변수명도 너무 기니까 줄이자
@FunctionalInterface
ㄴ 1번 2번 중 뭘 수행해야할지 헷갈려...
ㄴ 함수형 인터페이스 : 하나의 인터페이스 안에 추상메서드1개만 정의가능
ㄴ 단일역할, 역할 1가지만 수행

ㄴ @FunctionalInterface 이 있는 인터페이스가 보이면 -> 함수형 크로그래밍 즉 람다식을 써야하는 인터페이스다
Supplier<T> // 인터페이스
: T get() // 메서드명
Consumer<T>
: void accept(T t)
Function<T,R>
: R apply(T t)
Predicate<T>
: boolean test(T t)
참고)
predicate : 주로 판별을 의미
BiConsumer<T, U> // 인터페이스
: void accept(T t, U u) // 메서드명
BiFunction<T,U,R>
: R apply(T t, U u)

ㄴ 불편하지 않니??
Integer : 객체 -> 이대로는 연산불가, 연산은 기본자료형만 가능
① 연산을 위해서 Integer -> int (언박싱),
반환값 Integer로 변환(오토박싱),
int result로 변환 -> (언박싱)
-> 성능저하, 연산은 기본형으로 하는게 좋다!
② 자료형(Integer) 반복
->효율성이 떨어지넹...

①, ② 해결완료
ㄴ 언박싱 오토박싱 발생x : 해설 -> 기본형 타입의 함수형 인터페이스
ㄴ 자료형 반복x : 해설 -> 매개변수와 반환값 타입이 같은 자료형인 경우
BiPredicate<T, U>
: boolean test(T t, U u)
참고)
지네릭타입의 자료형은 참조자료형이랑 배열만 가능
UnaryOperator<T> ---> 상위 인터페이스 Function<T, T>
T apply(T t)
BinaryOperator<T> ---> 상위인터페이스 BiFunction<T, T, T>
T apply(T t1, T t2)



ㄴ To앞 : 매개변수타입 -> Long
ㄴ To뒤 : 반환값 타입 -> int

ㄴ 매개변수타입은 아무거나
ㄴ 반환값타입은 Long

참고) 자바문서
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/function/package-summary.html
Function
andThen(Function ... )
f.andThen(g) -> f -> g
compose(..)
g.compose(f) -> f -> g
예시)


예시) andThen

예시) compose

Predicate
and // 둘다 참인조건
or // 하나라도 참
negate // 참 -> 거짓, 거짓 -> 참
예시) Predicate

예시) and

예시) negate

참고) 자바문서
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/function/Predicate.html
예시) 클래스명::메서드명

예시2) 클래스명::메서드명

예시) 참조변수::메서드명


ㄴ 순서가 바뀌면 줄일 수x
예시) 메서드 참조

