Lambda
λ©μλλ₯Ό νλμ μ(Expression)μΌλ‘ ννν κ²μΌλ‘, μλ°λ κ°μ²΄μ§ν₯ μΈμ΄μ΄μ§λ§ λλ€μμ ν΅ν΄ ν¨μν νλ‘κ·Έλλ°μ νΉμ§μ λΆλΆμ μΌλ‘ μ§μνλ€.
ν¨μν μΈν°νμ΄μ€(Functional Interface)
λλ€μμ ν¨μν μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ λ°©μμΌλ‘, ν¨μν μΈν°νμ΄μ€λ λ¨ νλμ μΆμ λ©μλλ§μ κ°μ§λ μΈν°νμ΄μ€λ₯Ό μλ―Ένλ€.
쑰건
μ€μ§ νλμ μΆμ λ©μλλ§ μ‘΄μ¬ν΄μΌ ν¨
staticλ©μλλdefaultλ©μλλ κ°μμ μ ν μμjava.lang.Objectμ λ©μλ(toString, equals λ±)λ₯Ό μ€λ²λΌμ΄λ©ν μΆμ λ©μλλ μΉ΄μ΄νΈμμ μ μΈ
@FunctionalInterfaceμ»΄νμΌλ¬μκ² ν΄λΉ μΈν°νμ΄μ€κ° ν¨μν μΈν°νμ΄μ€μ 쑰건μ μΆ©μ‘±νλμ§ κ²μ¬νλλ‘ μμ²νλ μ΄λ Έν μ΄μ
μ μ§λ³΄μ κ³Όμ μμ μΆμ λ©μλκ° μΆκ°λλ μ€μ λ°©μ§
@FunctionalInterface
interface MyFunction {
int max(int a, int b);
// int min(int a, int b); // μ£Όμ ν΄μ μ μ»΄νμΌ μλ¬ λ°μ
}
class Main {
public static void main(String[] args) {
// 1. μ΅λͺ
ν΄λμ€ μ¬μ©
MyFunction f1 = new MyFunction() {
public int max(int a, int b) {
return a > b ? a : b;
}
};
// 2. λλ€μ μ¬μ© (μ΅λͺ
κ°μ²΄λ₯Ό λ체)
MyFunction f2 = (a, b) -> a > b ? a : b;
}
}μ΅λͺ
ν΄λμ€μμ μ°¨μ΄μ
λλ€μμ μ΅λͺ ν΄λμ€μ λΉμ·ν΄ 보μ΄μ§λ§ μ€μ½ν(Scope) μ²λ¦¬ λ°©μμμ μ°¨μ΄κ° μλ€.
μ΅λͺ ν΄λμ€
μλ‘μ΄ ν΄λμ€ μ€μ½νλ₯Ό μμ±ν¨
λ΄λΆμμ
thisλ₯Ό νΈμΆνλ©΄ μ΅λͺ ν΄λμ€ μμ μ μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν΄
λλ€μ
μλ‘μ΄ μ€μ½νλ₯Ό μμ±νμ§ μμ(run-timeμ λ³λμ ν΄λμ€ νμΌμ μμ±νμ§ μμ)
λ΄λΆμμ
thisλ₯Ό νΈμΆνλ©΄ λλ€μμ κ°μΈκ³ μλ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν΄
java.util.function ν¨ν€μ§
μλ°μμ μμ£Ό μ¬μ©λλ ν¨μν μΈν°νμ΄μ€ ν¨ν΄μ 미리 μ μν΄ λ ν¨ν€μ§λ‘, λ§€κ°λ³μμ λ°νκ°μ μ 무μ λ°λΌ ꡬλΆλλ€.
Runnable
void run()
X
X
μ€νλ§ νλ κ²½μ°
Supplier<T>
T get()
X
O
κ°μ 곡κΈ(λ°ν)λ§ νλ κ²½μ°
Consumer<T>
void accept(T t)
O
X
κ°μ λ°μ μλΉλ§ νλ κ²½μ°
Function<T, R>
R apply(T t)
O
O
κ°μ λ°μ λ³ννμ¬ λ°ννλ κ²½μ°
Predicate<T>
boolean test(T t)
O
boolean
쑰건μμ νμΈνμ¬ μ°Έ/κ±°μ§ λ°ν
UnaryOperator<T>
T apply(T t)
O
O
λ¨ν μ°μ°(μ λ ₯κ³Ό μΆλ ₯ νμ μ΄ κ°μ)
BinaryOperator<T>
T apply(T t1, T t2)
O, O
O
μ΄ν μ°μ°(μ λ ₯ 2κ°μ μΆλ ₯ νμ μ΄ κ°μ)
λ©μλ μ°Έμ‘°(Method Reference)
λλ€μμ΄ νλμ λ©μλλ§ νΈμΆνλ κ²½μ°, μ΄λ₯Ό λ κ°κ²°νκ² ννν μ μλ λ¬Έλ²μ΄λ€.
μ μ (Static) λ©μλ μ°Έμ‘°
(x) -> ClassName.method(x)
ClassName::method
μΈμ€ν΄μ€ λ©μλ μ°Έμ‘°
(obj, x) -> obj.method(x)
ClassName::method
νΉμ κ°μ²΄ λ©μλ μ°Έμ‘°
(x) -> obj.method(x)
obj::method
μμ±μ μ°Έμ‘°
() -> new ClassName()
ClassName::new
λ°°μ΄ μμ±μ μ°Έμ‘°
(x) -> new int[x]
int[]::new
μ°Έκ³ μλ£
Last updated
Was this helpful?