lambda and closure jihoon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
- λλ€ λμλ μ΄λ¦μ κ°μ§ νμκ° μλ€.(μ΅λͺ ν¨μ)
- λ κ° μ΄μμ μ λ ₯μ΄ μλ ν¨μλ μ΅μ’ μ μΌλ‘ 1κ°μ μ λ ₯λ§ λ°λ λλ€ λμλ‘ λ¨μν λ μ μλ€.(컀λ§)
- μ΅λͺ ν¨μλ λλ€ λμλ‘λΆν° μν₯μ λ°μ λ§λ€μ΄μ§ νλ‘κ·Έλλ°μμ ν¨μλ₯Ό νννλ λ°©μμ μΌμ’ .
- Java8λΆν° μ§μνκ² λ λλ€κ° μ΅λͺ ν¨μλ₯Ό μλ―Ένλ€.
- μ΅λͺ
ν¨μλ©΄μ μΌκΈ κ°μ²΄μ νΉμ§μ κ°μ§κ³ μμΌλ©΄ lambdaλΌκ³ ν μ μλ€.
- μΌκΈ κ°μ²΄λ ν¨μμ μΈμλ‘ λ겨 λ°μ μλ μμΌλ©°, ν¨μμ κ²°κ³Όκ°μΌλ‘ 리ν΄ν μλ μκ³ , λ³μμ ν λΉν μλ μλ€λ κ²μ λ§νλ€.
function adder(a) {
return function(b) {
return a + b;
}
}
var add5 = adder(5);
add5(10); // 15
ν΄λ‘μ λ λλ€λ‘λΆν° νμλ κ°λ
μ΄λ€.
add5
λΌλ ν¨μμ μ
μ₯μμ μκ°ν΄λ³Ό λ, μμ μ μ€μ½ν λ΄μ μλ b
λΌλ λ³μλ μΈμλ‘ λ°μ λ³μμ΄κ³ ν΄λΉ μ€μ½ν λ΄μ κ°νμμ§λ§, a
λΌλ λ³μλ λ체 μ΄λμ μμ μ¬μ©λκ³ μλμ§ μ μκ° μλ€. μ΄λμ a
λ₯Ό μμ λ³μ(Free variable)
, b
λ₯Ό λ¬ΆμΈ λ³μ(Bound variable)
λΌκ³ λΆλ₯Έλ€.
μμ λλ€μμμλ μμ λ³μ
μ λ¬ΆμΈ λ³μ
λ₯Ό νλμ© μ¬μ©νκ³ μλ€. λλ€μμ μ¬μ©νλ λ³μμ μ’
λ₯μ λ°λΌ λ μ’
λ₯λ‘ λλ μ μλ€. λ°λ‘ λ«ν λλ€μ(Closed expression)κ³Ό μ΄λ¦° λλ€μ(Open expression) μ΄λ€.
λλ€ ννμμμ μ¬μ©νλ λ³μλ€μ΄ λͺ¨λ λ¬ΆμΈ λ³μμΌ λ, λ«ν λλ€μμ΄λΌκ³ λΆλ₯Έλ€. κ·Έλ¦¬κ³ λλ€ ννμμμ μ¬μ©νλ λ³μλ€ μ€ νλλΌλ μμ λ³μκ° μμ λ μ΄λ¦° λλ€μμ΄λΌκ³ λΆλ₯Έλ€.
ν΄λ‘μ λ μ΄λ¦μ²λΌ λ°λ‘ μ΄λ¦° λλ€μμ λ«ν λλ€μμΌλ‘ λ§λλ κ²μ΄λ€. ν΄λ‘μ λ λλ€μ λ΄μ λͺ¨λ μμ λ³μλ₯Ό μ€μ½ν λ΄λ‘ κ°μ Έμ λ¬Άλλ€. κ·Έλ κΈ° λλ¬Έμ ν΄λ‘μ λ λ§λ€μ΄μ§ νκ²½μ κΈ°μ΅νλ κ²μ²λΌ 보μΈλ€.
MDNμμμ μ μ
ν΄λ‘μ λ λ 립μ μΈ (μμ ) λ³μλ₯Ό κ°λ¦¬ν€λ ν¨μμ΄λ€. λλ, ν΄λ‘μ μμ μ μλ ν¨μλ λ§λ€μ΄μ§ νκ²½μ βκΈ°μ΅νλ€β.
μ΅λͺ
ν΄λμ€λ³΄λ€ λ κ°λ΅νκ² μ¬μ©ν μ μλλ‘ νμ¬ ν¨μν νλ‘κ·Έλλ°μ ν μ μλλ‘ λμμ£Όλ κΈ°λ₯μ΄λ€.
ν¨μλ₯Ό λ³μμ²λΌ μ¬μ©νμ¬ νλΌλ―Έν° λ€λ₯Έ λ©μλμ μΈμλ‘ μ λ¬ν μ μκ³ , λ¦¬ν΄ κ°μΌλ‘ ν¨μλ₯Ό λ°μ μλ μλ€.
μλ°μ λλ€μμ ν¨μνμ λν΄ μλ‘ μ μν κ²μ΄ μλ, κΈ°μ‘΄μ μ‘΄μ¬νλ interfaceμ ννλ₯Ό λΉμ΄ λλ€μμ νννκΈ° λλ¬Έμ ν¨μν νλ‘κ·Έλλ°μ μ₯μ μ μμ ν κ°μ§μ§λ λͺ» νλ€.
- κΈ°μ‘΄μ μ΅λͺ ν΄λμ€λ°©μ
new Thread(new Runnable() {
public void run() {
System.out.println("Annoymous Thread");
}
}).start();
- λλ€λ°©μ
new Thread(() -> System.out.println("Lambda Thread")).start();
μμμ λλ€μμ ν΄λΉνλ λΆλΆμ μλκ³Ό κ°λ€.
()->System.out.println("Lambda Thread")
- () λ νλΌλ―Έν°μ ν΄λΉνλλ°, run() μ΄λΌλ μ΅λͺ ν΄λμ€μ λ©μλκ° μλ¬΄λ° νλΌλ―Έν°λ₯Ό μ·¨νμ§ μλλ€λ μλ―Έμ΄λ€.
- -> λ λλ€μ μμ μ μ λνλλ λλ€μ μμ ν ν°μ΄λ€. λ€μλ νμ€μ§λ¦¬ λλ€μ νΉμ { } μμ ν¬ν¨λ μ¬λ¬ λλ€μλ€μ΄ μ¬μ μλ€.
- System.out.println("Lambda Thread") λ λλ€μμ λ΄μ© λΆλΆμΌλ‘, μ΄ μμλ νλΌλ―Έν° κ°μ΄ μ¬μ©λ μ μλ€.
λλ€μμ Interface ννλ‘ λ³μλ‘ ν λΉλ μ μλ€. μ¦, λλ€μ λν κ°μ²΄μ ννλ₯Ό μ·¨νκ³ μλ€λ μλ―Έμ΄κ³ , λλ€μμμλ ν¨μμ μ΄λ¦μ μ¬μ©ν΄μ λ‘μ§μ μ μΈνμ§ μκΈ° λλ¬Έμ, μΈν°νμ΄μ€μμλ ν¨μμ μ΄λ¦μ΄ νμκ° μμκ² κ°μ§λ§, μμ μλ°μ λͺ¨λ κ²μ λ€μμμλ μκΈ° λλ¬Έμ κΈ°μ‘΄μ κ°μ²΄ ννλ‘€ ν΅ν΄ μΌμ’ μ μ μΆ©μ νμκ³ , κ·Έκ²μ΄ @FunctionalInterface λΌλ μ΄λ Έν μ΄μ μ΄λ€.
// Runnable.java
package java.lang;
// μΈν°νμ΄μ€ μμ @FunctionalInterface μ΄λ
Έν
μ΄μ
μ ν΅ν΄ ν¨μν μΈν°νμ΄μ€μμ μ μΈ
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
// Test.java
public class Test {
private static Runnable lambdaTest(Runnable runnable) {
runnable.run();
return ()->System.out.println("return lambda");
}
public static void main(String argsp[]) {
lambdaTest(()->System.out.println("input lambda")).run();
}
}
/*
κ²°κ³Ό)
input lambda
return lambda
*/
JDKμμ κΈ°λ³Έμ μΌλ‘ μ§μνλ(built-in) νμ€ ν¨μν μΈν°νμ΄μ€κ° μλ€.
-
java.util.function.UnaryOperator
- ν¨μ μκ·Έλμ²
T apply(T t)
- μΈμκ° 1κ°μ΄λ©°, 리ν΄κ°κ³Ό μΈμμ νμ μ΄ κ°λ€.
-
java.util.function.BinaryOperator
- ν¨μ μκ·Έλμ²
T apply(T t1, T t2)
- μΈμκ° 2κ°μ΄λ©°, 리ν΄κ°κ³Ό μΈμμ νμ μ΄ κ°λ€.
-
java.util.function.Predicate
- ν¨μ μκ·Έλμ²
boolean test(T t)
- μμμ νμ ννμ κ°μ²΄μ λ ₯μ λ°μ κ·Έκ°μ μ²λ¦¬ν ν κ²°κ³Όκ° trueμΈμ§ false μΈμ§λ₯Ό 리ν΄νλ€.
-
java.util.function.Function<T,R>
- ν¨μ μκ·Έλμ²
R apply(T t)
- 첫λ²μ§Έ μμμ ννμ μ λ ₯κ°μ λ°μ μ²λ¦¬νν λλ²μ§Έ μμμ ννμ κ°μΌλ‘ μΆλ ₯νλ€.
-
java.util.function.Supplier
- ν¨μ μκ·Έλμ²
T get()
- μ λ ₯κ°μ λ°λ‘ μμ§λ§, μΆλ ₯κ°μ ννλ₯Ό μ§μ ν μ μλ€.
-
java.util.function.Consumer
- ν¨μ μκ·Έλμ²
void accept(T t)
- μμννμ μ λ ₯κ°μ λ°μ μ²λ¦¬νκ³ μΆλ ₯μ νμ§ μλ ννμ μΈν°νμ΄μ€μ΄λ€.
보ν΅μ ν¨μλ μΈλΆμμ μΈμλ₯Ό λ°μμ λ‘μ§μ μ²λ¦¬νμ§λ§, ν΄λ‘μ λ μμ μ λλ¬μΌ context λ΄μ λ³μμ μ κ·Όν μ μλ€.
μ¦, μΈλΆ λ²μμ λ³μλ₯Ό ν¨μ λ΄λΆλ‘ λ°μΈλ©νλ κΈ°μ μ΄λ€.
νΉμ΄ν μ μ μμ μ λλ¬μΌ μΈλΆ ν¨μκ° μ’ λ£λλλΌλ μ΄ κ°μ΄ μ μ§λλ€λ κ²μ΄λ€. ν¨μμμ μ¬μ©νλ κ°λ€μ ν΄λ‘μ κ° μμ±λλ μμ μμ μ μλκ³ ν¨μ μμ²΄κ° λ³΅μ¬λμ΄ λ°λ‘ μ‘΄μ¬νκΈ° λλ¬Έμ΄λ€.
// anonymous ν΄λμ€μ closure
private static Function<String, Integer> function() {
int a = 100;
return new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s) * a;
}
};
}
Function<String, Integer> function = function();
Integer apply = function.apply("3");
System.out.println(apply);
// lambda closure
private static Function<String ,Integer> function(){
int a = 100;
return s -> Integer.parseInt(s) * a;
}
Function<String, Integer> function = function();
Integer apply = function.apply("3");
System.out.println(apply);