Bibi's DevLog π€π
[Java] λλ€μ, ν¨μν μΈν°νμ΄μ€ λ³Έλ¬Έ
[Java] λλ€μ, ν¨μν μΈν°νμ΄μ€
λΉλΉ bibi 2021. 2. 23. 23:18λλ€
μ°Έκ³ :
''μλ°μ μ μ'' μ λ³΄κ³ κ³΅λΆνμ΅λλ€.
λλ€μ Lambda expression
JDK1.8λΆν° λμ λ κ°λ μ΄λ€.
λλ€μμ λμ μΌλ‘ μλ°λ κ°μ²΄μ§ν₯μΈμ΄μΈ λμμ ν¨μν μΈμ΄κ° λμλ€.
λλ€μμ΄λ?
: λ©μλλ₯Ό νλμ μ(expression)μΌλ‘ ννν κ².
λλ€μμΌλ‘ ν¨μλ₯Ό κ°λ΅ν μμΌλ‘ ννν μ μλ€.
(λλ€μμ μ΅λͺ
ν΄λμ€μ κ°μ²΄μ λλ±νλ€)
- λ©μλλ₯Ό λλ€μμΌλ‘ νννλ©΄ λ©μλ μ΄λ¦κ³Ό 리ν΄κ°μ΄ μμ΄μ§λ€.
λλ¬Έμ λλ€μμ 'μ΅λͺ ν¨μ anonymous function' λΌκ³ λ νλ€.
(i) -> (int)(Math.random()*5)+1;
int method() {
return (int)(Math.random()*5) + 1;
}
μμ λλ€μκ³Ό μλμ method()λ κ°λ€.
λλ€μμ μ₯μ
λ©μλλ³΄λ€ κ°κ²°νλ©΄μ λ©μλμ μν μ λμ νλ€.
- λ©μλλ ν΄λμ€μ ν¬ν¨λμ΄μΌ νλ―λ‘ ν΄λμ€λ₯Ό μλ‘ λ§λ€μ΄μΌ νλ€.
λλ€μμ ν΄λμ€λ₯Ό μλ‘ λ§λ€ νμκ° μλ€. - λ©μλλ₯Ό νΈμΆνκΈ° μν΄ κ°μ²΄λ μμ±ν΄μΌ νλ€.
λλ€μμ κ°μ²΄λ₯Ό μμ±ν νμκ° μλ€.
- λ©μλλ ν΄λμ€μ ν¬ν¨λμ΄μΌ νλ―λ‘ ν΄λμ€λ₯Ό μλ‘ λ§λ€μ΄μΌ νλ€.
λλ€μμ λ©μλμ 맀κ°λ³μλ‘ μ λ¬λ μ μλ€.
λλ€μμ λ©μλμ κ²°κ³Όλ‘ λ°νλ μ μλ€.β λλ€μμΌλ‘ μΈν΄ μλ°μμλ λ©μλλ₯Ό λ³μμ²λΌ λ€λ£° μ μκ² λμλ€. (ν¨μν νλ‘κ·Έλλ° κ°λ₯, ν¨μκ° 1κΈ κ°μ²΄)
λ©μλμ ν¨μμ μ°¨μ΄λ?
λ©μλλ ν¨μμ λΉμ·ν μλ―Έμ΄μ§λ§,
- λ©μλλ κ°μ²΄μ§ν₯ κ°λ μ€ νλλ‘ κ°μ²΄μ νμλ₯Ό μλ―Ένλ μ©μ΄μ΄λ€.
- λ©μλλ νΉμ ν΄λμ€μ λ°λμ μν΄μΌ νλ€λ μ μ½μ΄ μλ€.
λλ€μμΌλ‘ λ©μλκ° νλμ λ 립μ κΈ°λ₯μ νκΈ° λλ¬Έμ, λ©μλμμ λ€μ ν¨μλΌκ³ λΆλ₯΄κ² λ¨.
λλ€μ μμ±νκΈ°
λλ€μμ 'μ΅λͺ ν¨μ'μ΄λ―λ‘,
λ©μλμμ 'μ΄λ¦'κ³Ό '리ν΄νμ 'μ μ κ±°νλ€.
맀κ°λ³μ μ μΈλΆ
()
μ λͺΈν΅{}
μ¬μ΄μ->
λ₯Ό μΆκ°νλ€.맀κ°λ³μμ νμ μ μΆλ‘ μ΄ κ°λ₯ν κ²½μ° μλ΅ν μ μλλ°, λλΆλΆμ κ²½μ° μλ΅ κ°λ₯νλ€.
리ν΄νμ μμ λλΆλΆμ κ²½μ° μΆλ‘ μ΄ κ°λ₯νλ―λ‘ μλ΅νλ€.
(int a, int b) -> a > b ? a : b
->(a, b) -> a > b? a : b
맀κ°λ³μκ° νλλΏμΈ κ²½μ°
()
λ₯Ό μλ΅ν μ μλ€.λ¨, 맀κ°λ³μμ νμ μ΄ μμΌλ©΄ μλ΅ν μ μλ€.
(a) -> a * a
->a -> a * a
(β)(int a) -> a * a
->int a -> a * a
(β)λͺΈν΅
{}
μμ λ¬Έμ₯μ΄ ν μ€μΈ κ²½μ°{}
λ₯Ό μλ΅ν μ μλ€.μ΄ λ λ¬Έμ₯μ λμ
;
λ₯Ό λΆμ΄μ§ μμμΌ νλ€.(String name, int i) -> { System.out.println(name + "=" + i); }
->
(String name, int i) -> System.out.println(name + "=" + i)
(β)λͺΈν΅
{}
μμ λ¬Έμ₯μ΄return
λ¬ΈμΈ κ²½μ°{}
λ₯Ό μλ΅ν μ μλ€.(int a, int b) -> { return a > b ? a : b; }
->
(int a, int b) -> return a > b ? a : b
(β)return
λ¬Έμμ,return
λμ μ(expression)μΌλ‘ λμ ν μ μλ€.(a, b) -> { return a > b ? a : b; }
->(a, b) -> a > b ? a : b
- μμ μ°μ°κ²°κ³Όκ° μλμΌλ‘ 리ν΄κ°μ΄ λλ€.
- λ¬Έμ₯μ΄ μλ μμ΄λ―λ‘ λμ
;
λ₯Ό λΆμ΄μ§ μλλ€.
리ν΄νμ λ©μλμ΄λ¦ (맀κ°λ³μ) { ... } // μΌλ° λ©μλ (맀κ°λ³μ) -> { ... } // λλ€μ
int max(int a, int b) { return a > b ? a : b; } // λ©μλ (int a, int b) -> { return a > b ? a : b; } // λλ€μ new Object() { int max(int a, int b) { return a > b ? a : b; } } // λλ€μμ μ¬μ€ λ©μλκ° μλ, 'μ΅λͺ ν΄λμ€μ κ°μ²΄'μ λλ±ν κ°λ μ΄λ€. (μλ λ΄μ© μ°Έμ‘°)
ν¨μν μΈν°νμ΄μ€ Functional Interface
μλ°μμ λͺ¨λ λ©μλλ ν΄λμ€μ ν¬ν¨λμ΄μΌ νλ€. κ·Έλ λ€λ©΄ λλ€μμ μ΄λ€ ν΄λμ€μ ν¬ν¨λλ κ²μΈκ°?
β λλ€μμ μ΅λͺ ν΄λμ€μ κ°μ²΄, μ¦ μ΅λͺ κ°μ²΄μ΄λ€.
(μ¬μ€ λλ€μμ λ©μλμ λλ±ν κ²μ΄ μλ, μ΅λͺ ν΄λμ€μ κ°μ²΄μ λλ±ν κ²μ΄λ€)
λλ€μμ μΈν°νμ΄μ€λ₯Ό ꡬνν μ΅λͺ κ°μ²΄λ₯Ό λ체ν μ μλ€.
λ¨, μ΅λͺ κ°μ²΄μ λ©μλμ λλ€μμ 맀κ°λ³μ νμ , 맀κ°λ³μ κ°μ, 리ν΄κ°μ΄ μΌμΉν΄μΌ νλ€.
ν¨μν μΈν°νμ΄μ€λ..
: λλ€μμ λ€λ£¨κΈ° μν μΈν°νμ΄μ€μ΄λ€.
μΈν°νμ΄μ€λ₯Ό ꡬνν μ΅λͺ κ°μ²΄λ₯Ό λλ€μμΌλ‘ λ체 κ°λ₯νκΈ° λλ¬Έμ, μΈν°νμ΄μ€λ₯Ό ν΅ν΄ λλ€μμ λ€λ£¨κ² λμλ€.
(쑰건) ν¨μν μΈν°νμ΄μ€μλ μ€μ§ νλμ μΆμλ©μλλ§ μ μλμ΄ μμ΄μΌ νλ€.
κ·ΈλμΌ λλ€μκ³Ό μΈν°νμ΄μ€μ λ©μλκ° 1:1λ‘ μ°κ²°λ μ μκΈ° λλ¬Έ.
(staticλ©μλ, defaultλ©μλ κ°μμλ μ νμ΄ μλ€)
@FuncionalInterface interface MyFunction { public abstract int max(int a, int b); } // ν¨μν μΈν°νμ΄μ€ MyFunctionμ μ μν μμ. μ΄λ Έν μ΄μ μ κΌ λΆμ΄μ.
λ©μλ νλλΏμΈ μΈν°νμ΄μ€λ₯Ό ꡬνν λ μλμ κ°μ΄ κ°λ¨νκ² λ§λ€ μ μκ² λλ€.
List<String> list = Arrays.asList("aaa", "bbb", "ccc"); Collections.sort(list, new Comparator<String>() { public int compare(String s1, String s2) { return s2.compareTo(s1); } }); // ν¨μν μΈν°νμ΄μ€ μ¬μ© μ List<String> list = Arrays.asList("aaa", "bbb", "ccc"); Collections.sort(list, (s1, s2) -> s2.compareTo(s1)); // ν¨μν μΈν°νμ΄μ€ μ¬μ© ν
ν¨μν μΈν°νμ΄μ€μ 맀κ°λ³μ νμ κ³Ό 리ν΄νμ
λλ€μμ μ°Έμ‘°λ³μλ‘ λ€λ£° μ μλ€. μ¦, λ©μλλ₯Ό ν΅ν΄ λλ€μμ λ³μμ²λΌ μ£Όκ³ λ°μ μ μκ² λμλ€.
(μ¬μ€ λ©μλκ° μλ κ°μ²΄λ₯Ό μ£Όκ³ λ°λ κ²μ΄κΈ° λλ¬Έμ κ·Όλ³Έμ μΌλ‘ λ¬λΌμ§ κ²μ μμ§λ§, μ½λκ° κ°κ²°νκ³ μ¬μμ‘λ€λ μ₯μ μ΄ μλ€)
ν¨μν μΈν°νμ΄μ€ λ©μλμ 맀κ°λ³μ νμ μ, ν¨μν μΈν°νμ΄μ€ μμ μΌλ‘ μ μν μ μλ€.
ν΄λΉ λ©μλλ₯Ό νΈμΆν λ λλ€μμ μ°Έμ‘°νλ μ°Έμ‘°λ³μλ₯Ό 맀κ°λ³μλ‘ μ§μ ν΄μΌ νλ€.
@FunctionalInterface interface MyFunction { void myMethod(); // μΆμ λ©μλ void aMethod(MyFunction f) { // 맀κ°λ³μνμ μ ν¨μν μΈν°νμ΄μ€ μμ μΌλ‘ μ§μ f.myMethod(); // MyFunctionμμ μ μλ λ©μλ νΈμΆ } }
MyFunction f = () -> System.out.println("myMethod()"); aMethod(f); aMethod(() -> System.out.println("myMethod()")) // aMethodλ₯Ό νΈμΆν λλ λλ€μμ μ°Έμ‘°νλ μ°Έμ‘°λ³μλ₯Ό 맀κ°λ³μλ‘ μ§μ ν΄μΌ ν¨
ν¨μν μΈν°νμ΄μ€ λ©μλμ 리ν΄νμ μ, ν¨μν μΈν°νμ΄μ€ μμ μΌλ‘ μ μν μ μλ€.
ν¨μν μΈν°νμ΄μ€μ μΆμλ©μλμ λλ±ν λλ€μμ κ°λ¦¬ν€λ μ°Έμ‘°λ³μλ₯Ό λ°ννκ±°λ, λλ€μμ μ§μ λ°νν μ μλ€.
@FunctionalInterface interface MyFunction { void myMethod(); // μΆμ λ©μλ MyFunction aMethod() { // 리ν΄νμ μ ν¨μν μΈν°νμ΄μ€ μμ μΌλ‘ μ§μ MyFunction f = () -> {}; return f; // return () -> {}; λ‘ μ€μΌ μ μλ€. } }
λλ€μμ νμ κ³Ό νλ³ν
λλ€μμ μ΅λͺ κ°μ²΄μ΄κ³ , μ΅λͺ κ°μ²΄λ νμ μ΄ μλ€.
(μ ννλ νμ μ μμ§λ§, μ»΄νμΌλ¬κ° μμλ‘ μ΄λ¦μ μ νλ―λ‘ μ μ μλ€)
ν¨μν μΈν°νμ΄μ€λ‘ λλ€μμ μ°Έμ‘°ν μλ μμ§λ§, λλ€μμ νμ μ΄ ν¨μν μΈν°νμ΄μ€μ νμ κ³Ό μΌμΉνλ κ²μ μλλ€.
λ°λΌμ μλλ μλμ κ°μ νλ³νμ΄ νμνλ€.
interface MyFunction { void method(); } MyFunction f = (MyFunction) (() -> {}); // μλ³μ νμ μ΄ λ€λ₯΄λ―λ‘ νλ³ν νμ.
λλ€μμ ν¨μν μΈν°νμ΄μ€λ₯Ό μ§μ ꡬννμ§ μμμ§λ§, ν¨μν μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ κ°μ²΄μ μμ ν λμΌνκΈ° λλ¬Έμ μ΄λ° νλ³νμ΄ κ°λ₯νλ€.
λ, μ΄ νλ³νμ μλ΅ κ°λ₯νλ€.
λλ€μμ κ°μ²΄μ΄μ§λ§ μ€μ§ ν¨μν μΈν°νμ΄μ€λ‘λ§ νλ³νμ΄ κ°λ₯νλ€.
μ¦ λ€λ₯Έ νμ μΌλ‘ μ§μ νλ³ν ν μ μλ€.
λλ€μμ λ€λ₯Έ νμ μΌλ‘ νλ³ννκΈ° μν΄μλ, ν¨μν μΈν°νμ΄μ€λ‘ νλ³νν λ€μ κ·Έ κ°μ²΄λ₯Ό λ€μ νλ³νν΄μΌ νλ€.
Object obj = (Object) (()->{}); // μλ¬ Object obj = (Object) (MyFunction) (()->{}); // λλ€μμ Objectλ‘ νλ³ν String str = ((Object) (MyFunction) (()->{})).toString(); // λλ€μμ StringμΌλ‘ νλ³ν
λλ€μμΌλ‘ μΈλΆ λ³μ μ°Έμ‘°
λλ€μμ μ΅λͺ κ°μ²΄, μ¦ μ΅λͺ ν΄λμ€μ μΈμ€ν΄μ€μ΄λ€.
λ°λΌμ μΈλΆ λ³μμ μ κ·Όνλ κ·μΉλ μ΅λͺ ν΄λμ€μ λ°©μκ³Ό λμΌνλ€.
λλ€μ λ΄μμ μ°Έμ‘°νλ μ§μλ³μλ
final
μ΄ λΆμ§ μμλ μμλ‘ κ°μ£Όλλ€.λλ€μ λ΄μμλ λ€λ₯Έ κ³³μμλ μ΄ λ³μμ κ°μ λ³κ²½ν μ μλ€.
μΈλΆ μ§μλ³μμ κ°μ μ΄λ¦μ λλ€μ 맀κ°λ³μλ νμ©λμ§ μλλ€.
(~ 'μλ°μ μ μ 2' p.802κΉμ§ μ 리ν¨)
'π₯ BE λ°±μλ > Java μλ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] κ°νλ¬Έμ, System.getProperty("line.separator") (1) | 2021.02.25 |
---|---|
[Java] μ€νΈλ¦Ό, μ€νΈλ¦Όμ μ°μ°, Optional (0) | 2021.02.23 |
[Java] StringBuffer, StringBuilder κ·Έλ¦¬κ³ String / StringBuffer κ°λ κ³Ό μ¬μ© / Bufferμ κ°λ (0) | 2021.02.22 |
[Java] try-with-resources κ°λ κ³Ό μ¬μ©λ² (0) | 2021.02.22 |
[Java] Value Object (VO) κ° κ°μ²΄ (0) | 2021.02.18 |