λλ€(lambda)
- ν¨μν νλ‘κ·Έλλ°μ μ§μνκΈ° μν ν΅μ¬ κΈ°λ₯
- λλ€λ μ΄λ¦μ΄ μλ μ΅λͺ
ν¨μλ‘ ν¨μλ₯Ό κ°κ²°νκ² ννν μ μλ€.
λ°ννμ
λ©μλλͺ
(λ§€κ°λ³μ){
λ³Έλ¬Έ
}
(λ§€κ°λ³μ) -> {λ³Έλ¬Έ};
- μλ°μμλ ν¨μκ° ν΄λμ€λ μΈν°νμ΄μ€μ κ΅¬μ± μμλ‘λ§ μ‘΄μ¬νλ€.
κ°κ²°ν νν
Procedure procedure = new Procedure() {
@Override
public void run() {
System.out.println("hello!");
}
};
- μ΅λͺ
ν΄λμ€ μ¬μ©μ new ν€μλ, ν΄λμ€λͺ
, λ©μλλͺ
, λ°ν νμ
λ±μ λͺ¨λ λμ΄ν΄μΌνλ€.
Procedure procedure = () -> {
System.out.println("hello! lambda");
};
- νμ§λ§ λλ€λ₯Ό μ¬μ©νλ©΄ λ§€κ°λ³μμ λ³Έλ¬Έλ§ μ μΌλ©΄ λλ€.
- μ½λμ κ°κ²°μ±κ³Ό λλΆμ΄ κ°λ
μ±λ λμμ§κΈ°μ μ½λ°±μ΄λ κ°λ¨ν λμ μ μμ μμ£Ό νμ©λλ€.
μ€κ΄νΈμ return μλ΅
LambdaEx2 le2 = (int a, int b) -> a + b;
LambdaEx2 le2 = (a, b) -> a + b;
LambdaEx2 le3 = (int a, int b) -> {
System.out.println("μ λ λλ€μ
λλ€.");
return a + b;
};
- λ¨μΌ ννμμΌ κ²½μ°
{}μ returnμ μλ΅ν μ μλ€.
- λ¨μΌ ννμμ΄ μλκ²½μ° λ°λμ
{}μ returnμ λͺ
μν΄μΌ νλ€.
- λλ€ ννμμ μ»΄νμΌλ¬κ° νμ
μ μΆλ‘ ν μ μλ κ²½μ° λ§€κ°λ³μμ νμ
μ μλ΅ν μ μλ€.
- λ§€κ°λ³μκ° μ¬λ¬ κ°μΈ κ²½μ° λͺ¨λ μλ΅νκ±°λ λͺ¨λ λͺ
μν΄μΌ νλ€.
ν¨μν μΈν°νμ΄μ€
- μ νν νλμ μΆμ λ©μλλ₯Ό κ°μ§λ μΈν°νμ΄μ€
- λλ€λ μΆμλ©μλκ° νλμΈ
ν¨μν μΈν°νμ΄μ€μλ§ ν λΉν μ μλ€.
- λ¨μΌ μΆμ λ©μλλ₯Ό μ€μ¬μ SAM(Single Abstract Method)μ΄λΌ νλ€.
λ¨μΌ μΆμλ©μλ
@FunctionalInterface
public interface Procedure(){
void run();
}
- μΆμλ©μλλ₯Ό νλλ§ κ°μ§κ³ μλ μΈν°νμ΄μ€ -> λλ€ μ¬μ©κ°λ₯
@FunctionalInterface: μΆμλ©μλκ° 2κ° μ΄μμ΄ λ μ μ»΄νμΌ νμμ μ€μλ₯Ό λ§μμ€λ€.
- λλ€λ₯Ό μ¬μ©ν ν¨μν μΈν°νμ΄μ€λΌλ©΄ κ°κΈμ ν΄λΉ μ΄λ
Έν
μ΄μ
μ μΆκ°νλ κ²μ κΆμ₯νλ€.
κ³ μ°¨ ν¨μ(Higher-Order Function)
κ³ μ°¨ ν¨μλ ν¨μλ₯Ό λ§€κ°λ³μλ‘ μ λ¬νκ±°λ ν¨μμ κ²°κ³Όλ‘ ν¨μλ₯Ό λ°ννλ ν¨μλ₯Ό λ§νλ€.
- μλ°μμ ν¨μ μ체λ₯Ό μ§μ μ£Όκ³ λ°μ μ μμ§λ§
ν¨μν μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μ΄λ₯Ό ꡬνν μ μλ€.
ν¨μλ₯Ό μ£Όκ³ λ°λλ€λ κ²μ μ€μ λ‘λ λλ€λ μ΅λͺ
ν΄λμ€μ²λΌ ν¨μν μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄λ₯Ό μ£Όκ³ λ°λ κ²μ μλ―Ένλ€.
- ν¨μ μ체λ₯Ό κ°μ²λΌ λ€λ£¨κΈ° λλ¬Έμ μΆμνμ μμ€μ΄ ν λ¨κ³ λμμ‘λ€κ³ ν΄μ
Higher-Order Functionμ΄λΌ λΆλ₯Έλ€.
- κ³ μ°¨ ν¨μλ λμμ μ μ°νκ² λ°κΎΈκ±°λ 곡ν΅λ λ‘μ§μ μΆμνν λ μ μ©νκ² νμ©λλ€.
- λλ€λ₯Ό λ§€κ°λ³μλ‘ μ λ¬
public class LamdaPass1 {
public static void main(String[] args) {
LambdaEx2 le1 = (a, b) -> a + b;
LambdaEx2 le2 = (a, b) -> a - b;
calculate(le1);
calculate(le2);
calculate((a, b) -> a + b);
calculate((a, b) -> a - b);
}
static void calculate(LambdaEx2 lambdaEx2) {
int a = 1;
int b = 2;
int result = lambdaEx2.apply(a, b);
System.out.println("κ³μ°κ²°κ³Ό: " + result);
}
}
- ν¨μμ κ²°κ³Όλ‘ λλ€λ₯Ό λ°ν
public class LamdaPass1 {
public static void main(String[] args) {
LambdaEx2 le4 = getOperation("add");
System.out.println("le4.apply(1, 2) = " + le4.apply(1, 2));
LambdaEx2 le5 = getOperation("sub");
System.out.println("le5.apply(1, 2) = " + le5.apply(1, 2));
LambdaEx2 le6 = getOperation("zero");
System.out.println("le6.apply(1, 2) = " + le6.apply(1, 2));
}
static LambdaEx2 getOperation(String operator){
switch (operator) {
case "add":
return (a, b) -> a + b;
case "sub":
return (a, b) -> a - b;
default:
return (a, b) -> 0;
}
}
}
λλ‘ κ³΅λΆνμλμ? λκ° μ΅μν λ§μ΄ λλ€μ.