Java8 - Lamda ννμ(expression)
Java8 μ΄μμ μ¬μ©νλ€λ©΄ λ°λμ μκ³ μμ΄μΌλ§ νλ "λλ€"μ λν΄ μμλ³΄κ² λ€.
μ΄ λλ€ ννμμ μ΅ν λμ§ μμΌλ©΄ μμΌλ‘ λ§λ€μ΄μ§λ μλ° μ½λλ₯Ό μ½λ λ° λ§€μ° μ΄λ €μμ κ²ͺμ μ μκΈ° λλ¬Έμ, κΌ μμλκΈ°λ₯Ό κΆνλ€.
π‘Lamda ννμμ μ λ§λ€μ΄μ‘μκΉ?
μ΅λͺ ν΄λμ€λ₯Ό μ¬μ©νλ©΄, ν΄λμ€λ₯Ό μλ‘κ² λ§λλ λ° νμν λΉμ©μ μ€μΌ μ μλ€λ μ₯μ μ΄ μμ§λ§, λ°λλ‘ κ°λ μ±μ΄ λ¨μ΄μ§λ λΆνΈν¨μ΄ μλ€. μ΄λ₯Ό 보μνκ³ μ λ§λ€μ΄μ‘λ€.
π‘Lamda ννμμ μΈμ μΈκΉ?
μ΄ ννμμ μΈν°νμ΄μ€μ λ©μλκ° "νλ"μΈ κ²λ€λ§ μ μ© κ°λ₯νλ€. κ·Έλμ, λλ€ ννμμ μ΅λͺ ν΄λμ€λ‘ μ νμ΄ κ°λ₯νλ©°, μ΅λͺ ν΄λμ€λ λλ€ ννμμΌλ‘ μ νμ΄ κ°λ₯νλ€.
π‘Javaμ μλ μΈν°νμ΄μ€ μ€, λ©μλκ° νλμΈ μΈν°νμ΄μ€μλ μ΄λ€ κ²λ€μ΄ μμκΉ?
βΆ java. lang.Runnable
βΆ java.util.Comparator
βΆ java.io.FileFilter
βΆ javauril.concurrent.Callable
βΆ java.security.PrivilegedAction
βΆ java.nio.file.PathMatcher
βΆ java.lang.reflect.InvocationHandler
κ·Έλ λ€λ©΄, μ΄μ ννμμ νλ² μ΄ν΄λ³΄μ.
(int x, int y) -> x + y
() -> 43
(String s) -> { System.out.println(s); }
κΈ°λ³Έ λλ€ ννμμ 3 λΆλΆμΌλ‘ ꡬμ±λμ΄ μλ€.
λ§€κ° λ³μ λͺ©λ‘ | νμ΄ν ν ν°(Arrow Token) | μ²λ¦¬ μ(λ¦¬ν΄ κ°) |
(int x, int y) | -> | x + y |
xμ yκ°μ λ°μμ x+yλ₯Ό μ²λ¦¬ν κ°μ 리ν΄ν΄ μ€λ€λ μλ―Έμ΄λ€.
μμ λ₯Ό ν΅ν΄μ μ΄ν΄λ³΄μ.
λ€μ μ½λμλ CalculateλΌλ μΈν°νμ΄μ€κ° μκ³ , μ¬κΈ°μλ operationμ΄λΌλ λ©μλ νλκ° μ μΈλμ΄ μλ€.
interface Calculate {
int operation(int a, int b);
}
μμ μΈν°νμ΄μ€λ₯Ό μ΅λͺ ν΄λμ€λ‘ ꡬννλ©΄ λ€μκ³Ό κ°λ€.
private void calculateClassic() {
Caculate calculateAdd = new Calculate() {
@Override
public int operation (int a, int b) {
return a+b;
}
};
System.out.println(CalculateAdd.operation(1,2));
}
μμ calculateAddλΌλ μ΅λͺ ν΄λμ€ κ°μ²΄λ₯Ό λλ€ ννμμΌλ‘ μ²λ¦¬ν΄λ³΄μ.
private void calculateLambda() {
Calculate calculateAdd = (a, b) -> a+b;
System.out.println(calculateAdd.operation(1,2));
}
μ½λκ° μμ² κ°λ¨ν΄μ‘λ€.
μ΄ λ©μλ λ΄μλ aμ bλΌλ λ³μκ° μ ν μ μΈλμ΄ μμ§λ μλλ°, μ΄λ κ² aμ bλ₯Ό μ¬μ©νκ³ κ·Έ κ°μ λνκΈ°κΉμ§ νκ³ μλ€. κ·Έ μ΄μ λ CalculateλΌλ μΈν°νμ΄μ€λ λ©μλκ° νλλ§ μ μΈλμ΄ μκΈ° λλ¬Έμ, (a, b)λΌκ³ λμ΄ μλ λΆλΆμ operation() λ©μλμ int aμ int bλ₯Ό 맀κ°λ³μλ‘ λ°λλ€λ μλ―Έκ° λλ€. (μ¬κΈ°μ aμ bμ²λΌ λ³μ μ΄λ¦μ μμλ‘ μ μΈν΄λ μ ν λ¬Έμ μλ€. x, yλ‘ ν΄λ μ΄μ μμ΄ μνλλ€.)
μ΄λ κ² νλλ§ μ μΈλμ΄ μλ μΈν°νμ΄μ€λ₯Ό Functional(κΈ°λ₯μ ) μΈν°νμ΄μ€λΌκ³ λΆλ₯Ό μ μλ€. λ§μ½ μ΄ μΈν°νμ΄μ€μ λ©μλκ° μΆκ°λλ€λ©΄, κΈ°μ‘΄μ μμ±ν΄λμλ λλ€μμ μ»΄νμΌ μ€λ₯κ° λ°μνλ€. μ΄λ¬ν νΌλμ νΌνκΈ° μνμ¬, μΈν°νμ΄μ€ μ μΈμ μ΄λ Έν μ΄μ μ μ¬μ©ν μ μλ€.
Functional Interface
@FunctionalInterface
interface Calculate {
int operation(int a, int b);
}
μ΄λ κ² μ μΈν΄λμΌλ©΄, λ¨ νλμ λ©μλλ§ μ μΈν μ μλ€. λ§μ½ λκ°λ₯Ό μ μΈν μ, Calculate is not a functional interfaceλΌλ λ©μΈμ§κ° λ¨λ©° μ»΄νμΌ μ€λ₯κ° λ°μνκ² λλ€.
μ 리
λ§μ§λ§μΌλ‘, μ°μ΅μΌμ ν΄λΉ μ½λλ₯Ό λλ€μμΌλ‘ λ³κ²½ν΄λ³΄μ.
private void runCommonThread() {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
};
new Thread(runnable).start();
}
μ λ΅ (cf. λ§μ½, λ©μλμμ μ²λ¦¬νλ κ²μ΄ μ¬λ¬μ€μΌ κ²½μ° {}(μ€κ΄νΈ)λ₯Ό μ¬μ©ν΄ λ¬Άμ μ μλ€.)
private void runCommonThread() {
new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
}