JDK1.8λΆν° λλ€μ(Lambda Expression)μ μ¬μ©ν μ μκ² λμλ€. μ΄κ²μ μλ°μ λ§€μ° ν° λ³ν μ€μ νλμ΄λ€. μ΄λ² κΈμ ν΅ν΄ 'λλ€μμ κ°λ ', 'λλ€μ μμ±λ²', 'ν¨μν μΈν°νμ΄μ€'λ₯Ό μμ보μ.
1. λλ€μ(Lambda Expression) π£
λλ€μ(Lambda Expression)μ λ©μλλ₯Ό νλμ 'μ(expression)'μΌλ‘ ννν κ²μ΄λ€. μ΄λ₯Ό ν΅ν΄ μλ°λ κ°μ²΄μ§ν₯μΈμ΄μΈ λμμ ν¨μν μΈμ΄κ° λμλ€. μλλ λͺ λ Ήν νλ‘κ·Έλλ°κ³Ό μ μΈν νλ‘κ·Έλλ°μ λν κ°λ΅ν λ΄μ©μ΄λ€. μ΄λ₯Ό μκ³ λλ€μμ λ°°μ΄λ€λ©΄ λλ€μμ λ΄μ©μ΄ λ μ½κ² λ€κ°μ¬ κ²μ΄λ€.
- λͺ λ Ήν νλ‘κ·Έλλ° (⊃ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°) : ν΄λμ€μμ λ©μλλ₯Ό μ μνκ³ , νμν λ κ·Έ λ©μλλ₯Ό νΈμΆνλ λͺ λ Ήμ νμ¬ λμνλ κ²
- μ μΈν νλ‘κ·Έλλ° (⊃ ν¨μν νλ‘κ·Έλλ°) : λ°μ΄ν°κ° μ λ ₯μΌλ‘ μ£Όμ΄μ§κ³ , λ°μ΄ν°κ° μ²λ¦¬λλ κ³Όμ (νλ¦)μ μ μνλ κ²μΌλ‘ λμνλ κ².
λλ€μμ μ΅λͺ
ν¨μ(anonymous function)λΌκ³ λ νλ€. κ°μ²΄μ§ν₯κ°λ
μμλ ν¨μ(function) λμ κ°μ²΄μ νμλ λμμ μλ―Ένλ λ©μλ(method)λΌλ μ©μ΄λ₯Ό μ¬μ©νλ€. λ©μλλ ν¨μμ κ°μ μλ―Έμ΄μ§λ§, νΉμ ν΄λμ€μ λ°λμ μν΄μΌ νλ€λ μ μ½μ΄ μλ€. κ·Έλμ κ°μ²΄μ§ν₯μμλ κΈ°μ‘΄μ ν¨μμ κ°μ μλ―Έμ λ€λ₯Έ μ©μ΄λ₯Ό μ νν΄μ μ¬μ©ν κ²μ΄λ€.
νμ§λ§ λλ€μμ μ΄μ©νλ€λ©΄ λ©μλλΌλ λ¨μ΄λ₯Ό μ΄ λͺ©μ κ³Ό λ€λ₯΄κ² νλμ λ
립μ μΈ κΈ°λ₯μ νκ² λλ€.(νΉμ ν΄λμ€μ λ°λμ μν νμκ° μλ€.) κ·Έλμ λλ€μμ μ΅λͺ
λ©μλκ° μλ μ΅λͺ
ν¨μλΌκ³ λΆλ₯΄λ κ²μ΄λ€.
2. λλ€μ μμ±λ² π
λ©μλκ° μλ μ΅λͺ ν¨μμ΄λ―λ‘ λ©μλμμ μ΄λ¦κ³Ό λ°ν νμ μ μ κ±°νμ¬ μ¬μ©νλ€. κ·Έλ¦¬κ³ λ§€κ°λ³μ μ μΈλΆμ λͺΈν΅{ } μ¬μ΄μ '->'μ μΆκ°νλ€.
// λ©μλ
λ°ννμ
λ©μλμ΄λ¦ (맀κ°λ³μ μ μΈ) {
...
}
// μ΅λͺ
ν¨μ (λλ€μ)
(맀κ°λ³μ μ μΈ) -> {
...
}
μμ νμ΄ κΈ°λ³Έμ μΈ κ²μ΄κ³ μλμ 5κ°μ§λ§ κΈ°μ΅νλ€λ©΄ μμ½κ² λλ€μμ λ§λ€ μ μλ€.
1. λ°νκ°μ΄ μλ λ©μλμ κ²½μ°, returnλ¬Έ λμ 'μ(expression)'μΌλ‘ λμ ν μ μλ€. μ(expression)μ λ¬Έμ₯(statement)μ΄ μλλ―λ‘ λμ ';'μ μλ΅ν μ μλ€.
// μ(expression) μ¬μ©X
(int a, int b) -> {return a > b ? a : b; }
// μ(expression) μ¬μ©O
(int a, int b) -> a > b ? a : b
2. λλ€μμ μ μΈλ 맀κ°λ³μμ νμ μ μΆλ‘ μ΄ κ°λ₯ν κ²½μ°λ μλ΅ν μ μλ€. (λλΆλΆμ κ²½μ°μ μλ΅μ΄ κ°λ₯νλ€.)
// μΆλ‘ κ°λ₯ν νμ
μλ΅ μ
(int a, int b) -> a > b ? a : b
// μΆλ‘ κ°λ₯ν νμ
μλ΅ ν
(a, b) -> a > b ? a : b
3. 맀κ°λ³μκ° νλλΏμΈ κ²½μλ κ΄νΈ( )λ₯Ό μλ΅ν μ μλ€. (맀κ°λ³μμ νμ μ΄ μμΌλ©΄ κ΄νΈ μλ΅ λΆκ°λ₯)
// 맀κ°λ³μκ° νλμΈ κ²½μ° κ΄νΈ μλ΅ μ
(a) -> a * a
// 맀κ°λ³μκ° νλμΈ κ²½μ° κ΄νΈ μλ΅ ν
a -> a * a
// 맀κ°λ³μμ νμ
μ΄ μμΌλ©΄ κ΄νΈ( ) μλ΅ λΆκ°λ₯
(int a) -> a * a
int a -> a * a // Error
4. κ΄νΈ{ } μμ λ¬Έμ₯μ΄ νλμΌ λλ κ΄νΈ{ }λ₯Ό μλ΅ν μ μλ€. μ΄λ λ¬Έμ₯ λμ ';'λ₯Ό λΆμ΄μ§ λ§μμΌ νλ€.
// κ΄νΈ{ }μμ λ¬Έμ₯μ΄ νλμΌ λ κ΄νΈ{ } μλ΅ μ
(String name, int i) -> {
System.out.println(name + "=" + i);
}
// κ΄νΈ{ }μμ λ¬Έμ₯μ΄ νλμΌ λ κ΄νΈ{ } μλ΅ ν
(String name, int i) ->
System.out.println(name + "=" + i) // λ¬Έμ₯ λμ ';'λ₯Ό λΆμ΄μ§ μμμΌ ν¨!
5. κ΄νΈ { } μμ λ¬Έμ₯μ΄ returnλ¬ΈμΌ κ²½μ° κ΄νΈ { }λ₯Ό μλ΅ν μ μλ€.
// κ΄νΈ{ }μμ λ¬Έμ₯μ΄ returnλ¬ΈμΌ κ²½μ° κ΄νΈ{ }λ₯Ό μλ΅ν μ μλ€!
(int a, int b) -> { return a > b ? a : b;} // OK
(int a, int b) -> return a > b ? a : b // Error
3. ν¨μν μΈν°νμ΄μ€(Functional Interface) π€
Comparatorμμ μ΄ν΄λ³Έ κ²μ²λΌ μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ μ΅λͺ ν΄λμ€μ κ°μ²΄λ₯Ό μμ±ν μ μμλ€.
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
};
λλ€μλ μ€μ λ‘λ μ΅λͺ κ°μ²΄μ΄λ―λ‘ μμ μ½λλ₯Ό λλ€μμΌλ‘ λ체ν μ μλ€.
Comparator<String> comparator1 = (String o1, String o2) -> o1.length() - o2.length();
μμ κ³Όμ μ μ΄ν΄λ³΄λ©΄ νλμ μΈν°νμ΄μ€λ₯Ό λλ€μμΌλ‘ λ€λ£¨κ³ μλ€. μ΄λ μλ°μ κ·μΉμ μ΄κΈ°μ§ μμΌλ©΄μλ μμ°μ€λ½λ€. κ·Έλμ μΈν°νμ΄μ€λ₯΄ ν΅ν΄ λλ€μμ λ€λ£¨κΈ°λ‘ κ²°μ νμκ³ , λλ€μμ λ€λ£¨κΈ° μν μΈν°νμ΄μ€λ₯Ό 'ν¨μν μΈν°νμ΄μ€(functional interface)'λΌκ³ λΆλ₯΄κΈ°λ‘ νλ€. μ¬μ©λ°©λ²μ μλμ κ°λ€.
- μ»΄νμΌλ¬κ° ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬λ°λ₯΄κ² μ μνλμ§ νμΈνκΈ° μνμ¬ @FunctionalInterfaceλ₯Ό λΆμ¬μ€λ€.
- μ€μ§ νλμ μΆμ λ©μλλ§ μ μνλ€.
- staticλ©μλμ defaultλ©μλμ κ°μμλ μ μ½μ΄ μλ€.
@FunctionalInterface
interface FunctionForLambda {
public abstract int method();
}
맀κ°λ³μμ κ°μμ λ¦¬ν΄ νμ μ λ°λΌμ μ¬λ¬ κ°μ μΈν°νμ΄μ€λ₯Ό λ§λ€ μ μλ€.
// 맀κ°λ³μκ° μλ κ²½μ°
@FunctionalInterface
interface FunctionForLambda1 {
public abstract void method();
}
// 맀κ°λ³μκ° νλμΈ κ²½μ°
@FunctionalInterface
interface FunctionForLambda2 {
public abstract void method(int a);
}
// 맀κ°λ³μκ° λκ°μΈ κ²½μ°
@FunctionalInterface
interface FunctionForLambda3 {
public abstract void method(int a, int b);
}
// 리ν΄νμ
μ΄ intμΈ κ²½μ°
@FunctionalInterface
interface FunctionForLambda4 {
public abstract int method();
}
// 리ν΄νμ
μ΄ BooleanμΈ κ²½μ°
@FunctionalInterface
interface FunctionForLambda5 {
public abstract boolean method();
}
5κ°λ§ μ μμ§λ§ μ€μ λ‘λ λ λ§μ κ°μμ μΈν°νμ΄μ€κ° μ‘΄μ¬ν μ μλ€. (맀κ°λ³μλ 0κ°, 1κ°, 2κ° μ λλ₯Ό μμ£Ό μ¬μ©νλ―λ‘) λ§μ½ Genericsλ₯Ό μ¬μ©νλ€λ©΄ μμ£Ό μ°λ ν¨μν μΈν°νμ΄μ€λ λͺ κ°κ° λμ§ μμ κ²μ΄λ€. κ·Έλμ μμ£Ό μ°μ΄λ νμμ ν¨μν μΈν°νμ΄μ€λ₯Ό java.util.functionν¨ν€μ§μ μ΄λ―Έ μ μν΄ λμλ€. μ΄λ λ€μ κΈμμ μμΈν μμ보λλ‘ νμ.
맀κ°λ³μμ νμ μ ν¨μν μΈν°νμ΄μ€λ‘ μ§μ ν μ μλ€. λ³μμ²λΌ λ©μλλ₯Ό μ£Όκ³ λ°λλ€κ³ λ³Ό μλ μκΈ΄ νλ°, μ ννλ λ©μλκ° μλλΌ κ°μ²΄λ₯Ό μ£Όκ³ λ°λ κ²μ΄λ€. (λΉμ°νκ² ν μ μλ κ²μ΄λ€.)
void method (MyFunction f) {
f.FunctionalInterfaceMethod();
}
MyFunction f = () -> System.out.println("MyFunction f");
method(f);
ν΄λΉ κΈμ λ¨κΆ μ±λμ Javaμ μ μμ μ½κ³ μμ±ν κ²μ λλ€.
'π JAVA > μ£Όμ κ°λ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ μΆλ ₯(I/O)(1) - λ Έλ μ€νΈλ¦Ό, 보쑰 μ€νΈλ¦Ό (0) | 2023.01.29 |
---|---|
λλ€μ(Lambda Expression) - (2) (0) | 2023.01.29 |
Comparableκ³Ό Comparator (0) | 2023.01.28 |
μμΈμ²λ¦¬(Exception Handling) - (2) (0) | 2023.01.28 |
μμΈμ²λ¦¬(Exception Handling) - (1) (0) | 2023.01.28 |