λλ€μ(Lambda Expression)
λλ€μ(Lambda Expression)μ΄λΒ ν¨μλ₯Ό νλμ μ(expression)μΌλ‘ ννν κ²μ΄λ€. ν¨μλ₯Ό λλ€μμΌλ‘ νννλ©΄Β λ©μλμ μ΄λ¦μ΄ νμ μκΈ° λλ¬Έμ, λλ€μμΒ μ΅λͺ
ν¨μ(Anonymous Function)μ ν μ’
λ₯λΌκ³ λ³Ό μ μλ€.
μ΅λͺ
ν¨μ(Anonymous Function)λ ν¨μμ μ΄λ¦μ΄ μλ ν¨μλ‘, μ΅λͺ
ν¨μλ€μ λͺ¨λ μΌκΈ κ°μ²΄
λλ€μμ μ¬μ©νλ©΄ λ©μλ λͺ
μ΄ λΆνμν΄μ§κ³ , κ΄νΈ()μ νμ΄ν βλ₯Ό μ΄μ©ν ν¨μλ₯Ό μ μΈνκ² λλ€
// κΈ°μ‘΄ λ°©μ
public String hello() { return "Hello World!"; }
// λλ€μ μ μ©
() -> "Hello World!";
Java
볡μ¬
μ΄λ κ² λλ€μμ΄ λ±μ₯νκ² λ μ΄μ λΒ λΆνμν μ½λλ₯Ό μ€μ΄κ³ , κ°λ
μ±μ λμ΄κΈ° μν¨μ΄λ€.
κ·Έλ κΈ° λλ¬ΈμΒ ν¨μν μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό μμ±νμ¬ ν¨μλ₯Ό λ³μμ²λΌ μ μΈνλ λλ€μμμλ λ©μλμ μ΄λ¦μ΄ λΆνμνλ€κ³ μ¬κ²¨μ Έμ μ΄λ₯Ό μ¬μ©νμ§ μλλ€.
λμ μ»΄νμΌλ¬κ° λ¬Έλ§₯μ μ΄ν΄ νμ
μ μΆλ‘ νλ€. λν λλ€μμΌλ‘ μ μΈλ ν¨μλ 1κΈ κ°μ²΄μ΄κΈ° λλ¬ΈμΒ Stream APIμ 맀κ°λ³μλ‘ μ λ¬μ΄ κ°λ₯ν΄μ§λ€.
[ λλ€μ(Lambda Expression) μ νΉμ§ ]
β’
λλ€μ λ΄μμ μ¬μ©λλ μ§μλ³μλ finalμ΄ λΆμ§ μμλ μμλ‘ κ°μ£Όλλ€.
β’
λλ€μμΌλ‘ μ μΈλ λ³μλͺ
μ λ€λ₯Έ λ³μλͺ
κ³Ό μ€λ³΅λ μ μλ€.
[ λλ€μ(Lambda Expression) μ μ₯μ ]
1.
μ½λλ₯Ό κ°κ²°νκ² λ§λ€ μ μλ€.
2.
μμ κ°λ°μμ μλκ° λͺ
νν λλ¬λ κ°λ
μ±μ΄ λμμ§λ€.
3.
ν¨μλ₯Ό λ§λλ κ³Όμ μμ΄ νλ²μ μ²λ¦¬ν μ μμ΄ μμ°μ±μ΄ λμμ§λ€.
4.
λ³λ ¬νλ‘κ·Έλλ°μ΄ μ©μ΄νλ€.
[ λλ€μ(Lambda Expression) μ λ¨μ ]
1.
λλ€λ₯Ό μ¬μ©νλ©΄μ λ§λ 무λͺ
ν¨μλ μ¬μ¬μ©μ΄ λΆκ°λ₯νλ€.
2.
λλ²κΉ
μ΄ μ΄λ ΅λ€.
3.
λλ€λ₯Ό λ¨λ°νλ©΄ λΉμ·ν ν¨μκ° μ€λ³΅ μμ±λμ΄ μ½λκ° μ§μ λΆν΄μ§ μ μλ€.
4.
μ¬κ·λ‘ λ§λ€κ²½μ°μ λΆμ ν©νλ€.
λλ€μ ννλ²
λλ€μμ 맀κ°λ³μ + μ€νλ¬Έ ννλ‘ κ΅¬μ±λλ€. μ¦ μ κ·Όμ, λ°νν λͺ¨λ μλ΅λλ ꡬ쑰μ΄λ€.
λͺ¨μμ ( ) β { }; ννλ‘ κ΅¬μ±λλ€. κ΄νΈ μμ interface ν¨μμ 맀κ°λ³μλ₯Ό μ
λ ₯νκ³ , β λ€μ { } μμ μ€νν μ½λλ₯Ό μμ±νλ©΄ λλ€.
μμ μΈν°νμ΄μ€
public interface Calculator{
public int cal(int num1, int num2);
}
Java
볡μ¬
1.
κΈ°λ³Έ μ¬μ©λ² ( 맀κ°λ³μ νμ
) β { }; )
public static void main(String[] args){
Caculator cal = (int num1, int num2) -> {return num1 + num2; };
System.out.println(cal.cal(1 , 2));
}
Java
볡μ¬
2.
맀κ°λ³μ νμ
μλ΅( (맀κ°λ³μ) β { }; )
public static void main(String[] args){
Caculator cal = (num1, num2) -> {return num1 + num2; };
System.out.println(cal.cal(1 , 2));
}
Java
볡μ¬
맀κ°λ³μκ° 1κ°μ΄κ±°λ 2κ° μ΄μμ 맀κ°λ³μμ νμ
μ΄ λͺ¨λ κ°μ λλ νμ
μ μλ΅ κ°λ₯
3.
맀κ°λ³μκ° μλ κ²½μ° ( ( ) β { }; )
public static void main(String[] args){
Caculator cal = () -> { System.out.println("맀κ°λ³μκ° μλ κ²½μ°")};
cal.cal();
}
Java
볡μ¬
4.
μ€κ΄νΈ μλ΅ ( ( ) β ; )
public static void main(String[] args){
Caculator cal = (num1, num2) -> num1 + num2;
System.out.println(cal.cal(1 , 2));
}
Java
볡μ¬
μ€νν λ¬Έμ₯μ΄ 1κ°μΌ λμλ μ€κ΄νΈλ₯Ό μλ΅ν μ μλ€. μ΄ λ μ€μν μ μ λ°νμ΄ νμν λ©μλμ κ²½μ° return ν€μλλ₯Ό μλ΅ν΄μΌ νλ€.
5.
μκ΄νΈ μ€κ΄νΈ μλ΅ ( 맀κ°λ³μ β ; )
public static void main(String[] args){
Caculator cal = num1 -> System.out.println(num1);
cal.cal(1);
}
Java
볡μ¬
맀κ°λ³μκ° 1κ°μ΄κ³ , μ€νν λ¬Έμ₯μ΄ 1κ°μΈ κ²½μ° ( ) μ { } λ₯Ό λͺ¨λ μλ΅ν μ μλ€.
ν¨μν μΈν°νμ΄μ€(Functional Interface)
β’
ν¨μν μΈν°νμ΄μ€λΒ μΆμ λ©μλκ° μ€μ§ νλμΈ μΈν°νμ΄μ€λ₯Ό μλ―Ένλ€.
β’
ν¨μν μΈν°νμ΄μ€λ§μ΄ λλ€μμΌλ‘ νν κ°λ₯νλ€.
β’
Javaλ κΈ°λ³Έμ μΌλ‘Β κ°μ²΄μ§ν₯ μΈμ΄μ΄κΈ° λλ¬Έμ μμ ν¨μμ μΌλ° ν¨μλ₯Ό λ€λ₯΄κ² μ·¨κΈνκ³ μλ€. Javaμμλ μ΄λ₯Ό ꡬλΆνκΈ° μν΄ ν¨μν μΈν°νμ΄μ€κ° λ±μ₯νκ² λμλ€.
β’
μΆμ λ©μλκ° νλλΌλ λ»μΒ default methodΒ λλΒ static methodΒ λ μ¬λ¬ κ° μ‘΄μ¬ν΄λ μκ΄ μλ€λ λ»μ΄λ€.
β’
κ·Έλ¦¬κ³ Β @FunctionalInterfaceΒ μ΄λ
Έν
μ΄μ
μ μ¬μ©νλλ°, μ΄ μ΄λ
Έν
μ΄μ
μ ν΄λΉ μΈν°νμ΄μ€κ° ν¨μν μΈν°νμ΄μ€ 쑰건μ λ§λμ§ κ²μ¬ν΄μ€λ€.
β’
@FunctionalInterfaceΒ μ΄λ
Έν
μ΄μ
μ΄ μμ΄λ ν¨μν μΈν°νμ΄μ€λ‘ λμνκ³ μ¬μ©νλ λ° λ¬Έμ λ μμ§λ§, μΈν°νμ΄μ€ κ²μ¦κ³Ό μ μ§λ³΄μλ₯Ό μν΄ λΆμ¬μ£Όλ κ² μ’λ€.
Variable Capture
λλ€μμ μ€ν λΈλ‘ λ΄μμ λλ€μμ κ°μΈκ³ μλ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ, μ€νν± λ³μ, μ§μ λ³μμ μ κ·Όνλ κ²μ΄ κ°λ₯νλ€.
νμ§λ§ μ§μ λ³μμ μ κ·Όν λλ Variable CaptureλΌλ νΉλ³ν μμ
μ΄ μνλκΈ° λλ¬Έμ μ μ½μ΄ μκΈ΄λ€.
1.
λ‘컬 λ³μλΒ finalμΌλ‘ μ μΈλμ΄μΌ νλ€,
2.
finalλ‘ μ μΈλμ΄ μμ§ μμ λ‘컬 λ³μλΒ Effectively Final(final μ²λΌ λμ)μ΄μ΄μΌ νλ€.
μ¦, κ°μ μ¬ν λΉμ΄ μΌμ΄λλ©΄ μλλ€.
μ΄λ¬ν μ μ½μ¬νμ΄ μκΈ΄ μ΄μ λ ν΄λμ€ λ΄λΆμ μ μΈλ λ‘컬 ν΄λμ€(μ¬κΈ°μ λλ€μ)κ° μ§μ λ³μλ₯Ό μ°Έμ‘°ν λλ κ·Έ κ°μ 볡μ¬ν΄μ μ¬μ©νκΈ° λλ¬Έμ΄λ€.
μ΄λ₯Ό Variable CaptureλΌκ³ νλ€. μ½κ² λ§νλ©΄ Variable Captureλ κ°μ²΄ μΈλΆμμ μ μΈλ λ³μλ₯Ό κ°μ²΄ λ΄λΆλ‘ 볡μ¬νλ νμμ΄λ€. μ§μ λ³μ λΏλ§ μλλΌ νλΌλ―Έν°λ‘ μ λ¬λ λ³μ λν μΈλΆμμ μ μΈλ λ³μμ΄λ―λ‘ κ°μ κ·μΉμ΄ μ μ©λλ€.
μΈλΆμμ μ μΈλ λ³μλ₯Ό μ§μ μ¬μ©νμ§ μκ³ λ΄λΆλ‘ 볡μ¬ν΄μ€λ μ΄μ λ λ³μμ κ°μ²΄μ μλͺ
μ£ΌκΈ°μ κ΄λ ¨μ΄ μκ³ μμΈν μ€λͺ
μ μλμ κ°λ€.
μ€νν± λ³μλ λ©μλ μμμ, μΈμ€ν΄μ€ λ³μλ ν μμμ, μ§μ λ³μλ νΈμΆμ€νμ κ°κ° μμ±λλ€. λλ€μ λν μ΅λͺ
κ°μ²΄μ μΈμ€ν΄μ€μ΄κΈ° λλ¬Έμ ν μμμ μμ±λλ€.
μ§μ λ³μλ ν΄λΉ λ³μλ₯Ό μ μΈν λ©μλκ° μ’
λ£λλ μκ° λ©λͺ¨λ¦¬μμ μ¬λΌμ§λ€. νμ§λ§ λ‘컬 ν΄λμ€λ μμ λ€λ₯Έ μμΉμμ μμ±λκΈ° λλ¬Έμ μλͺ
μ£ΌκΈ°κ° λ©μλμ μ ν μκ΄μ΄ μλ€. λ°λΌμΒ μ€νν± λ³μ, μΈμ€ν΄μ€ λ³μμ λ¬λ¦¬Β λ‘컬 ν΄λμ€κ° μ§μ λ³μλ₯Ό μ¬μ©νλ €κ³ ν λλ ν΄λΉ μ§μ λ³μκ° μ΄λ―Έ νΈμΆμ€νμμ μ¬λΌμ‘μ μνμ΄ νμ μ‘΄μ¬νλ€.(맀κ°λ³μλ λ§μ°¬κ°μ§λ€)
κ·ΈλΌ λ‘컬 ν΄λμ€λ μ λλ‘ μΈλΆμμ μ μΈλ λ³μλ₯Ό μ°Έμ‘°ν μ μλλ‘ μ μ½ν΄μΌ ν κΉ? κ·Έλ° μ μ½μ κ±Έμ§ μμΌλ©΄μλ μμμ μΈκΈν μνμ±μ μ κ±°νκΈ° μν΄μ μλ°μμλ κ°μ²΄ μΈλΆμ μ μΈλ λ³μμ κ°μ 볡μ¬(Variable Capture)νλ©΄μ λμμ ν΄λΉ λ³μλ λ°λμ finalμ΄μ΄μΌ νλ€λ μλ‘μ΄ μ μ½μ λ§λ€μλ€.
λ©μλ, μμ±μ λ νΌλ°μ€
λλ€μμ΄ νλμ λ©μλλ§ νΈμΆνλ κ²½μ°, λλ€μμ λμ± κ°κ²°νκ² νννλ λ°©λ²μ΄ μ‘΄μ¬νλ©° μ΄λ₯Ό λ©μλ λ νΌλ°μ€λΌκ³ λΆλ₯Έλ€.
Static Method Referenece
Function<String, Integer> f = (String s) -> Integer.parseInt(s); // κΈ°μ‘΄ λλ€μ
Function<String, Integer> f = Integer::parseInt; // λ©μλ λ νΌλ°μ€ μ μ©
Java
볡μ¬
Instance Method Reference
BiFunction<String, String, Boolean> f = (s1, s2) -> s1.equals(s2); // λλ€μ
BiFunction<String, String, Boolean> f = String::equals; // λ©μλ λ νΌλ°μ€
Java
볡μ¬
μ΄λ―Έ μμ±λ κ°μ²΄μ λ©μλ Reference
MyClass obj = new MyClass();
Function<String, Boolean> f = (x) -> obj.equals(x); // λλ€μ
Function<String, Boolean> f = obj::equals; // λ©μλ λ νΌλ°μ€
Java
볡μ¬
μμ±μ Refernce
// 맀κ°λ³μκ° μλ μμ±μ
Supplier<MyClass> s = () -> new MyClass; // λλ€μ
Supplier<MyClass> s = MyClass::new; // μμ±μ λ νΌλ°μ€
// 맀κ°λ³μκ° μ‘΄μ¬νλ μμ±μ
Function<Integer, MyClass> f = (i) -> new MyClass(i); // λλ€μ
Function<Integer, MyClass> f = MyClass::new; // μμ±μ λ νΌλ°μ€
Java
볡μ¬