ν°μ€ν 리 λ·°
π λλ€μ
: λ©μλλ₯Ό νλμ 'μ(expression)'μΌλ‘ ννν κ²
: μ΅λͺ ν¨μλΌκ³ λ ν¨(λ§€μλμ μ΄λ¦X, λ°νκ°X)
ππ»βοΈ λλ€μμ μ₯μ
βοΈ ν΄λμ€λ₯Ό λ§λ€κ³ , μΈμ€ν΄μ€λ₯Ό μμ±νλ κ³Όμ μ μλ΅νκ³ λ©μλ(ν¨μ)λ₯Ό λ§λ€ μ μμ!
βοΈ λ©μλλ₯Ό λ³μμ²λΌ λ€λ£° μ μμ
// κΈ°μ‘΄ λ©μλ
int max(int a, int b) {
return a > b ? a : b;
}
// λλ€μ
(int a, int b) -> { return a > b ? a : b; }
(int a, int b) -> a > b ? a : b
(a, b) -> a > b ? a : b
βοΈ λλ€μμ λ§€κ°λ³μμ λ°νκ°μ νμ μ μΆλ‘μ΄ κ°λ₯ν κ²½μ° μλ΅O (λλΆλΆμ κ²½μ° μλ΅)
βοΈ λ§€κ°λ³μκ° νλλ©΄ (κ΄νΈ) μλ΅ κ°λ₯
βοΈ {κ΄νΈ} μμ λ¬Έμ₯μ΄ νλλ©΄ (κ΄νΈ} μλ΅ κ°λ₯ (λ¬Έμ₯ λμ μΈλ―Έμ½λ‘ (;)X)
π ν¨μν μΈν°νμ΄μ€
: λλ€μμ λ€λ£¨κΈ° μν μΈν°νμ΄μ€
βοΈ μ€μ§ νλμ μΆμ λ©μλλ§ μ μ (λλ€μκ³Ό μΈν°νμ΄μ€λ₯Ό 1:1λ‘ μ°κ²°νκΈ° μν΄)
ππ»βοΈ λλ€μμ μ ν¨μν μΈν°νμ΄μ€λ‘ λ€λ£¨μ£ ?
π‘ λλ€μμ μ¬μ€ λ©μλμ κ°μ λλ±ν κ²μ΄ μλλΌ μ΅λͺ ν΄λμ€μ κ°μ²΄μ λλ±
ππ» κ°μ²΄μ§ν₯ β ‘μμ μ΅λͺ ν΄λμ€λ₯Ό λ°°μ μ
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°β ‘
π μμ : κΈ°μ‘΄ ν΄λμ€λ₯Ό μ¬μ¬μ©νμ¬ μλ‘μ΄ ν΄λμ€λ₯Ό μμ±νλ κ² : (+) μ½λ μ¬μ¬μ©μ±↑, νλ‘κ·Έλ¨ μμ°μ±↑, μ μ§λ³΄μππ» : extends ν€μλ μ¬μ© class Child extends Parent { ... } : μμ±μμ μ΄κΈ°ν
uijin.tistory.com
μ¦,
(a, b) -> a > b ? a : b
β μ΄ λλ€μ μμ²΄κ° μ΅λͺ ν΄λμ€μ μ μΈ + μΈμ€ν΄μ€ν (μΌνμ©) → μ΄κ² κ°λ₯ν μ΄μ λ ν¨μν μΈν°νμ΄μ€κ° μ€μ§ 1κ°μ μΆμλ©μλλ₯Ό κ°μ§κ³ μμ΄μ!
1οΈβ£ λ¨Όμ , λλ€μμΌλ‘ μ μΈλ μ΅λͺ κ°μ²΄μ λ©μλλ₯Ό μ΄λ»κ² νΈμΆν μ μμκΉ?
→ μΌλ°μ μΌλ‘ κ°μ²΄μ λ©μλλ₯Ό νΈμΆνλ €λ©΄, μ΅λͺ κ°μ²΄μ μ°Έμ‘°λ³μκ° νμ
νμ
f = (a, b) -> a > b ? a : b;
2οΈβ£ νμ μ μ΄λ»κ² ν΄μΌ ν κΉ?
→ μ°Έμ‘° λ³μμ΄λ―λ‘ ν΄λμ€ λλ μΈν°νμ΄μ€κ° κ°λ₯!
→ μ¦, λμ λλ€μκ³Ό μΌμΉνλ μ μΈλΆλ₯Ό κ°μ§ μΆμλ©μλλ₯Ό κ°μ§κ³ μλ μΈν°νμ΄μ€κ° νμ! (κ·ΈλμΌ νμ μ μΈν°νμ΄μ€λ‘ νκ³ , ν΄λΉ μΆμ λ©μλλ₯Ό λμ λλ€μμΌλ‘ ꡬννκ±Έλ‘ μκ°νκ³ μ¬μ©ν μ μμΌλκΉ!)
interface MyFunction {
public abstract int max(int a, int b);
}
MyFunction f = (a, b) -> a > b ? a : b;
f.max(1, 2); // λλμ΄ λλ€μμ μ€μ λ‘ μ¬μ©γ
γ
→ κ·Έλμ λ±μ₯ν κ²μ΄ ν¨μν μΈν°νμ΄μ€ (ex. μμ MyFunction μΈν°νμ΄μ€)
μ¬μ€, μλ λ€μκ³Ό κ°μ
MyFunction f = new MyFunction() { // MyFunction μΈν°νμ΄μ€λ₯Ό ꡬνν μ΅λͺ
ν΄λμ€
public int max(int a, int b) {
return a > b ? a : b;
}
};
μ΄λ, MyFunctionμ΄ ν¨μν μΈν°νμ΄μ€λ©΄ λλ€μμΌλ‘ λμ²΄κ° κ°λ₯ βλλ€μλ μ€μ λ‘λ μ΅λͺ κ°μ²΄μ΄κΈ° λλ¬Έβ
β νλμ λ©μλκ° μ μΈλ μΈν°νμ΄μ€λ₯Ό μ μν΄μ λλ€μμ λ€λ£¨λ κ²μ κΈ°μ‘΄μ μλ°μ κ·μΉλ€μ μ΄κΈ°μ§ μμΌλ©΄μλ μμ°μ€λ¬μ :-)
βοΈ λλ€μμ λ©μλμ λ§€κ°λ³μμ λ°νκ°μΌλ‘ μ¬μ©νκΈ°
: ν΄λΉ λ©μλμ λ§€κ°λ³μ λλ λ°νκ°μ΄ ν¨μν μΈν°νμ΄μ€ νμ μ΄λ©΄ λλ€μ μ¬μ©κ°λ₯!
void myMethod(MyFunction f) { ... }
myMethod(() -> System.out.println("MyFunction"));
λλ
MyFunction f = () -> System.out.println("MyFunction"));
myMethod(f);
βοΈ λλ€μμ νμ ? ν¨μν μΈν°νμ΄μ€ νμ ?
: ν¨μν μΈν°νμ΄μ€λ‘ λλ€μμ μ°Έμ‘°ν μ μλ κ²μΌ λΏ, λλ€μμ νμ μ΄ ν¨μν μΈν°νμ΄μ€μ νμ κ³Ό μΌμΉνλ κ²μ μλ! (λλ€μμ μ΅λͺ κ°μ²΄μ΄κ³ μ΅λͺ κ°μ²΄λ νμ μ΄ μμ! - μ ννκ²λ νμ μ΄ μμ§λ§ μ»΄νμΌλ¬κ° μμλ‘ μ νκΈ° λλ¬Έμ μ μ μλ κ²) but λλ€μμ΄ ν¨μν μΈν°νμ΄μ€λ₯Ό μ§μ ꡬννμ§ μμμ§λ§, κ·Έ ν¨μν μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ κ°μ²΄μ μμ ν λμΌνκΈ° λλ¬Έμ νλ³νμ νμ©!
MyFunction f = (MyFunction) (() -> System.out.println("MyFunction"))); // λͺ
μμ νλ³ν μλ΅ κ°λ₯!
β λλ€μμ μ€μ§ ν¨μν μΈν°νμ΄μ€λ‘λ§ νλ³νμ΄ κ°λ₯ (Objectλ X)
βοΈ λλ€μλ λ΄λΆ ν΄λμ€μ΄λ―λ‘, λλ€μ μΈλΆμ μ μΈλ λ³μμ μ κ·Όνλ κ·μΉμ΄ λ΄λΆ ν΄λμ€μ κ°μ!
: λλ€μ λ΄μμ μ°Έμ‘°νλ μ§μλ³μλ finalμ΄ λΆμ§ μμμ΄λ μμλ‘ κ°μ£Ό (κ° λ³κ²½X)
: μΈλΆ μ§μλ³μμ κ°μ μ΄λ¦μ λλ€μ λ§€κ°λ³μ νμ©X
π java.util.function ν¨ν€μ§
https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html
Function (Java Platform SE 8 )
docs.oracle.com
: μμ£Ό μ°μ΄λ νμμ λ©μλλ₯Ό ν¨μν μΈν°νμ΄μ€λ‘ 미리 μ μν΄ λμ ν¨ν€μ§
ππ»βοΈ ν¨μν μΈν°νμ΄μ€λ₯Ό μλ‘ μ μνλ κ²λ³΄λ€ μ΄λ€μ μ΄ μ’μ£ ?
βοΈ λλΆλΆμ λ©μλλ νμ μ΄ λΉμ·ν¨ (λ§€κ°λ³μλ 0 -2κ°, λ°νκ°μ 0 - 1κ°)
βοΈ μ§λ€λ¦ λ©μλλ‘ μ μνλ©΄ λ§€κ°λ³μλ λ°ν νμ μ΄ λ¬λΌλ λ¬Έμ X
βοΈ ν¨μν μΈν°νμ΄μ€μ μ μλ λ©μλ μ΄λ¦μ΄ ν΅μΌ → μ¬μ¬μ©μ±ππ» μ μ§λ³΄μππ»
βοΈ λ§€κ°λ³μκ° λ κ°μΈ ν¨μν μΈν°νμ΄μ€
β λ κ° μ΄μμ λ§€κ°λ³μλ₯Ό κ°λ ν¨μν μΈν°νμ΄μ€κ° νμνλ©΄ μ§μ λ§λ€μ΄μΌ ν¨!
βοΈ UnaryOperatorμ BinaryOperator
ν¨μν μΈν°νμ΄μ€ Descripter Method
UnaryOperator T -> T T applay(T t)
BinaryOperator (T, T) -> T T applay(T t, T t)
: λ§€κ°λ³μμ λ°νκ°μ νμ μ΄ λͺ¨λ μΌμΉνλ€λ μ λ§ μ μΈνκ³ λ Functionκ³Ό κ°μ
βοΈ ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ 컬λ μ νλ μμν¬
βοΈ κΈ°λ³Ένμ μ¬μ©νλ ν¨μν μΈν°νμ΄μ€
: λ§€κ°λ³μ λλ λ°νκ°μ νμ μ΄ κΈ°λ³Έν(ex. int, double)μ μ¬μ©νμ ν¨μν μΈν°νμ΄μ€
π μ°Έκ³ λ§ν¬
https://bcp0109.tistory.com/313
Java 8 ν¨μν μΈν°νμ΄μ€ (Functional Interface)
Overview ν¨μν μΈν°νμ΄μ€λ 1 κ°μ μΆμ λ©μλλ₯Ό κ°λ μΈν°νμ΄μ€λ₯Ό λ§ν©λλ€. Java8 λΆν° μΈν°νμ΄μ€λ κΈ°λ³Έ ꡬν체λ₯Ό ν¬ν¨ν λν΄νΈ λ©μλ (default method) λ₯Ό ν¬ν¨ν μ μμ΅λλ€. μ¬λ¬ κ°μ λ
bcp0109.tistory.com
ππ»βοΈ κ΅³μ΄ κΈ°λ³Ένμ μ¬μ©νλ μΈν°νμ΄μ€λ₯Ό λ°λ‘ μ°λ μ΄μ κ° μλμ?
π©π»π« μλ κΈ°λ³Έν νμ μ κ°μ μ²λ¦¬ν λ λνΌ ν΄λμ€λ₯Ό μ¬μ©νμ§λ§, λνΌν΄λμ€λ₯Ό μ¬μ©νλ κ²μ λΉν¨μ¨μ μ!
ν¨μν μΈν°νμ΄μ€ Descripter Method μ€λͺ
DoubleToIntFunction double -> int int applyAsInt(double d) AToBFunctionμ μ λ ₯μ΄ Aνμ μΆλ ₯μ΄ Bνμ
TonIntFunction<T> T -> int int applyAsInt(T value) ToBFunctionμ μΆλ ₯μ΄ Bνμ μ΄λ€. μ λ ₯μ μ§λ€λ¦νμ
IntFunction int -> T R apply(T t, U u) AFunctionμ μ λ ₯μ΄ Aνμ μ΄κ³ μΆλ ₯μ μ§λ€λ¦νμ
ObjIntConsumer<T> (T, int) -> void void accept(T t, U u) ObjAFunctionμ μ λ ₯μ΄ T, Aνμ μ΄κ³ μΆλ ₯μ μμ
β IntToIntFunctionμ΄ μλ μ΄μ λ IntUnaryOperatorκ° ν΄λΉ μν μ ν μ μκΈ° λλ¬Έ! Function<Integer, Integer>μ΄λ IntFunction<Integer>λ³΄λ€ λ ν¨μ¨μ μ!
π ν¨μν μΈν°νμ΄μ€μ ν©μ±!
βͺοΈ Function
default <V> Function<T, V> andThen(Function<? super P, ? extends V> after)
default <V> Function<V, R> compose(Function<? super V, ? extends T> before)
static <T> Function<T, V> identity()
Function<String, Integer> f = (s) -> Integer.parsrInt(s, 16);
Function<Integer, String> g = (i) -> Integer.toBinaryString(i);
Function<String, String> h = f.andThen(g); // h("FF")λ g(f("FF"))
β identity()λ x -> xμΈ νλ±μ
βͺοΈ Predicate
default Predicate<T> and(Predicate<? super T> other)
default Predicate<T> or(Predicate<? super T> other)
default Predicate<T> negate()
static <T> Predicate<T> isEqual(Object targetRef)
Predicate<Integer> p = i -> i < 100;
Predicate<Integer> q = i -> i < 200;
Predicate<Integer> r = i -> i%2 == 0;
Predicate<Integer> notP = p.negate(); // i >= 100
Predicate<Integer> all = notP.and(q.or(r)); // all.test(150) μ΄λ°μμΌλ‘ μ¬μ© κ°λ₯!
π λ©μλ μ°Έμ‘°
βοΈ λλ€μμ΄ νλμ λ©μλλ§ νΈμΆνλ κ²½μ° λ©μλ μ°Έμ‘°λ‘ λλ€μμ κ°λ΅ν ν μ μμ!
βοΈ ν΄λμ€μ΄λ¦::λ©μλμ΄λ¦ or μ°Έμ‘°λ³μ::λ©μλμ΄λ¦ νμμΌλ‘ μ¬μ©!
(String s) -> Integer.parseInt(s); // κΈ°μ‘΄ λλ€μ
Integer::parseInt // λ©μλ μ°Έμ‘°
x -> obj.equals(x)
obj::equals // μ΄λ° κ²½μ° μ°Έμ‘°λ³μ::λ©μλμ΄λ¦ νμμ μ¨μΌν¨!
βοΈ μμ±μλ λ©μλ μ°Έμ‘°λ‘ λ³ν κ°λ₯
() -> new MyClass();
MyClass::new
x -> new int[x]
int[]::new
β λ§€κ°λ³μκ° μλ μμ±μλΌλ©΄, λ§€κ°λ³μμ κ°―μμ λ°λΌ μλ§μ ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©! νμνλ€λ©΄ ν¨μν μΈν°νμ΄μ€λ₯Ό μλ‘ μ μ!
'μΈμ΄ > μλ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λ μ§μ μκ° & νμν (0) | 2023.08.13 |
---|---|
μ€νΈλ¦Ό(stream) (0) | 2023.08.06 |
μ°λ λ (0) | 2023.07.30 |
μ λν μ΄μ (0) | 2023.07.20 |
μ΄κ±°ν (0) | 2023.07.17 |