λλ€
μ€λͺ
μ΅λͺ
ν¨μλ€. μ΅λͺ
ν¨μ μ¦, μ½λ λΈλμ΄λ€.
μ½λ λΈλμ λ©μλ λ΄μ μ‘΄μ¬ν΄μΌ νλ€!
β» μ΅λͺ
ν¨μ
μ¬μ¬μ© κ°λ₯ν κΈ°λ₯μ μΌλΆλΆμ μ λ¬νκ³ μΆμλ μ¬μ©νλκ².
ν¨μλ€μ ν¨μλ₯Ό μΈμλ‘ μ λ¬νλ κ²½μ° (μ½λ°±?)
μ½λμμ
//κΈ°λ³Έ λ¬Έλ²
(args) -> {
//λΈλΌλΈλΌ
}
/*
ASIS: λλ€λ νμ
μ§μμ(Integer)λ₯Ό μλ΅ν μ μλ€
ν¨μν μΈν°νμ΄μ€κ° νμ
μ μ€λͺ
νκ³ μμ΄,
μ»΄νμΌλ¬κ° νμν λͺ¨λ μ 보λ₯Ό μ 곡ν΄μ€ μ μκΈ° λλ¬Έμ΄λ€.
*/
(Intefer x) -> x + 1;
// TOBE: μ΄λ κ²!
(x) -> x + 1
//ASIS: 맀κ°λ³μ νλμΈ μΈν°νμ΄μ€ λ©μλ μ
(x) -> x + 1
// TOBE: μ΄λ κ² νν κ°λ₯
x -> x + 1
// ASIS: μ΅λͺ
ν΄λμ€ μΌλ°μ μ¬μ©
void annoymousClass() {
final Server server = new HttpServer();
waitFor(new Condition() {
@Override
public Boolean isSatisfied() {
return !server.isRunning();
}
});
}
// TOBE: λλ€ μ¬μ© - ν΄λ‘μ μ§λ§ λλ€λ€.
void Closure() {
Server server = new HttpServer();
waitFor(() -> !server.isRunning());
}
// (λ³λ) WaitFor ν΄λμ€
class WaitFor {
static void waitFor(Condition condition) throws
InterruptedException {
While (!condition.isSatisfied())
Thread.sleep(250);
}
}
public class LambdaStudy {
private String firstName = "Jack";
public void λλ€κ°_firstName_μ_μ§μ _μ κ·Ό() {
Function<String, String> addSurname = surname -> {
// λλ€κ° firstName λ³μμ μ§μ μ κ·Όμ΄ κ°λ₯. (νλ,λ©μλ,μ§μλ³μμ μ κ·Ό κ°λ₯)
return this.firstName + " " + surname;
};
}
}
λλ€κ° λμ
λ μ΄μ
μ€λͺ
λΉ
λ°μ΄ν°λ₯Ό λ€λ£¨κΈ° μν΄ λ©ν°μ½μ΄λ₯Ό νμ©ν λΆμ°μ²λ¦¬, μ¦ λ³λ ¬ν κΈ°μ μ΄ νμ νμμ.
κ·Έλμ java8 μμλ λ³λ ¬νλ₯Ό μν΄ λ°°μ΄, List, Set, Mapμ κ°ννμκ³ μ€νΈλ¦Όμ κ°ν νμλ€.
κ·Έλ¦¬κ³ μ€νΈλ¦Όμ ν¨μ¨μ μΌλ‘ μ¬μ©νκΈ° μν΄ ν¨μν νλ‘κ·Έλλ°, ν¨μν νλ‘κ·Έλλ°μ μν΄ λλ€,
λλ€λ₯Ό μν΄ μΈν°νμ΄μ€ λ³νκ° μλ° λμλ€.
λΉ
λ°μ΄ν° μ§μ → λ³λ ¬ν κ°ν → 컬λ μ
κ°ν → μ€νΈλ¦Ό κ°ν → λλ€ λμ
→ μΈν°νμ΄μ€ λͺ
μΈ λ³κ²½ → ν¨μν μΈν°νμ΄μ€ λμ
λλ€μ μ₯/λ¨μ
μ₯μ
μ½λκ° κ°κ²°νλ€. κ°λ°μμ μλλ₯Ό μ½κ² νμ
ν μ μλ€.
λ³λ ¬ μ²λ¦¬μ μ 리ν¨.
ν¨μλ₯Ό λ§λλ μκ°μ λ λ€μΌ μ μλ€.
λ¨μ
μ½λ λ¨μ©μ λλ²κΉ
μ΄ νλ€ μ μλ€.
μ¬κ· λ‘μ§ λ§λλκ²μ μ΄λ ΅λ€.
λ©μλ μ°Έμ‘°
μ€λͺ
λ©μλ μ°Έμ‘°λ₯Ό λλ€λ‘μ μ¬μ©ν λμ μ΄λ―Έ μ‘΄μ¬νλ μ΄λ¦μ κ°μ§ λ©μλλ₯Ό κ°λ¦¬ν€λ κ²μΈλ°, κ·Έκ²μ μ΄λ―Έ λͺΈμ²΄λ₯Ό κ°μ§κ³ μλ€.
μΌλ° λ©μλλ₯Ό ν¨μν μΈν°νμ΄μ€λ‘ μ ννλ νλ.
β» ν¨μν μΈν°νμ΄μ€ (@FunctionalInterfate)
ν¨μν λ©μλ or SAM(λ¨μΌ μΆμ λ©μλ)
νλμ μΈν°νμ΄μ€μ νλμ λ©μλλ§ κ°μ§ μ μμ.
λΆλͺ¨μ ν¨μν λ©μλ μ€λ²λΌμ΄λ κ°λ₯
@FunctionalInterface
interface A {
abstract void apply();
}
// κ°λ₯
interface B extends A {
@Override
abstract void apply();
}
// λΆκ°λ₯
interface B extends A {
@Override
abstract void illegal();
}
λ©μλ μ°Έμ‘°μ νΉμ§
μμ½λ‘ (::)μ μλΆλΆμ λμμΌλ‘ νλ ν΄λμ€λͺ
, λ·λΆλΆμ λ©μλλͺ
method λ€μ μκ΄νΈ()μ μ°μ§ μλλ€.
λ©μλ μ°Έμ‘°μ μ ν
μμ±μ μ°Έμ‘° (String::new)
μμ½λ‘ λ€μ newκ° λΆμ
String ν΄λμ€μ μΈμμλ μμ±μλ₯Ό νΈμΆνλ λλ€λ₯Ό μμ±
() → new String() κ³Ό κ°μ μλ―Έ
μ μ λ©μλ μ°Έμ‘° (String::valueOf)
x → String.valueOf(x)
λ κ°μ§ μ νμ΄ μΈμ€ν΄μ€ λ©μλ μ°Έμ‘° (x::toString)
xλ μ κ·Ό κ°λ₯ν νΉμ μΈμ€ν΄μ€λΌ κ°μ
() → x.toString()
λλ€μ μμΈ μ²λ¦¬
μ€λͺ
λλ€λ μμΈμ²λ¦¬λ₯Ό μν μλ‘μ΄ λ¬Έλ²μ΄ μ‘΄μ¬νμ§ μμ.
λλ€μμ λμ Έμ§ μμΈλ€μ μΌλ° λ©μλ νΈμΆκ³Ό λμΌνκ² νΈμΆν κ³³μΌλ‘ μ ν λλ€.
μ¦, λλ€λ₯Ό νΈμΆνλ λ©μλμμ μ΄λ»κ² μ€νλ μ§μ λν΄ μ±
μμ μ§μ§ μμ. λλ€λ λ³λ ¬ λλ λ―Έλμ μ΄λ μμ μ μ²λ¦¬λ μλ μκΈ° λλ¬Έ.
μμΈμ²λ¦¬κ° κ°λ₯νλλ‘ λ‘μ§μ λ§λ€μλ μμ§λ§ μ½λκ° μ₯ν©ν΄μ§λ€.
λΉμ§λμ€ λ‘μ§ < μλ¬ μ²λ¦¬ μν 보μΌλ¬ νλ μ΄νΈ μ½λ
ν¨μμ ν΄λμ€
μ€λͺ
ν΄λμ€λ μΈμ€ν΄μ€νκ° λμ΄μΌ ν¨. ν¨μλ κ·Έλ μ§ μμ.
ν΄λμ€λ μλ‘ μμ±λλ©΄ κ°μ²΄λ₯Ό μν΄ λ©λͺ¨λ¦¬κ° ν λΉλ¨.
ν¨μλ₯Ό μν λ©λͺ¨λ¦¬λ λ± νλ² ν λΉ λ¨. (μλ° νμ νΌλ¨ΈλνΈ(permanent)μμμ μ μ₯ λ¨.
κ°μ²΄λ μμ λ§μ λ°μ΄ν°λ₯Ό κ°μ§μ§λ§ ν¨μλ λ°μ΄ν°μ μ°κ΄ κ΄κ³κ° μλ€.
μλ° ν΄λμ€μ μ μ λ©μλλ ν¨μμ κ±°μ μ μ¬νλ€.
μ°Έκ³
(μ±
) μλ° λλ€ λ°°μ°κΈ°
(μ±
) μ€νλ§ μ
λ¬Έμ μν μλ° κ°μ²΄μ§ν₯μ μ리μ μ΄ν΄
https://coding-factory.tistory.com/265