-
Java8 - Lamda ννμ(expression)κ°λ°/Java 2022. 4. 29. 17:57
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(); }
'κ°λ° > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ