Lambda Expression
Java์ ๋๋ค (ํํ)์
๋๋ค ํํ์์ด๋? ํจ์(method)๋ฅผ ์(expression)์ผ๋ก ํํํ ๊ฒ
Java๋ jdk1.8(java 8)๋ถํฐ ํจ์ํ ๊ธฐ๋ฅ ์ผ๋ถ ์ง์
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ
// ์ผ๋ฐ int add(int a, int b) { return a+b; } // ํจ์ํ (a, b) -> { return a+b; } // ์ถ์ฝ ํํ (a, b) -> a + b
๋ฉ์๋ ์ด๋ฆ, ๋ฐํํ์ ์ ๋ณด๊ฐ ์ ๊ฑฐ๋จ
๋ฐํ๊ฐ๋ง ์๋ ๊ฒฝ์ฐ ์ค๊ดํธ, return ๋ฌธ ์ ๊ฑฐํ๊ณ ์ถ์ฝ ํํ ์ฌ์ฉ ๊ฐ๋ฅ
๋งค๊ฐ๋ณ์๊ฐ ํ๋๋ฉด ์๊ดํธ๋ ์๋ต ๊ฐ๋ฅ (๋์ ํ์ ์ ๋ณด ์์ด์ผ ํจ)
Java์ ๋๋ค์์
์ต๋ช ํจ์
๊ฐ ์๋๋ผ์ต๋ช ๊ฐ์ฒด
์? Java์์ ํจ์๋ ๋ฐ๋์ ํด๋์ค ๋ด๋ถ์ ๋ฉ์๋๋ก ์กด์ฌํด์ผ ํ๋ฏ๋ก
// ๋๋ค์ (a, b) -> a > b ? a : b // ์ปดํ์ผ ์ ์ทจ๊ธ (์ต๋ช ๊ฐ์ฒด) new Object() { int max(int a, int b) { return a > b ? a : b; } }
๋๋ค์์ ์ด์ฉํ๊ธฐ ์ํด์๋
ํจ์ํ ์ธํฐํ์ด์ค
๊ฐ ํ์ํจ
ํจ์ํ ์ธํฐํ์ด์ค
๋๋ค์์ ๋ค๋ฃจ๊ธฐ ์ํด ์ ์ธํ๋ ์ธํฐํ์ด์ค
(๋๋ค์์ผ๋ก ์ ์ธ๋ ) ๋จ ํ๋์ ๋ฉ์๋๋ง ๊ฐ๋๋ค.
@FunctionalInterface
์ด๋ ธํ ์ด์ ์ ์ด์ฉํ๋ค. (๋ฉํ ์ด๋ ธํ ์ด์ ๋ถ๋ถ ์ฐธ์กฐ)์์1) max ๋๋ค์์ ์ํ ํจ์ํ ์ธํฐํ์ด์ค
public class LambdaExample { public static void main(String[] args) { MaxFunc maxFunc = (a, b) -> a > b ? a : b; System.out.println(maxFunc.max(3, 5)); // 5 } } interface MaxFunc { // ๋๋ค์์ ๋ถ์ฌํ๋ ์ด๋ฆ์ธ ๊ฒ int max(int a, int b); }
์์2) ์ ๋ ฌ ์กฐ๊ฑด์ ์ง์ ํ๋ Comparator์ ๋์ ๋ฐฉ์
// in Collections.java public static <T> void sort(List<T> list, Comparator<? super T> c) { list.sort(c); }
// 3, 1, 7 ๋ค์ด์๋ ๋ฆฌ์คํธ ์ ์ธ ํ ์ ๋ ฌ List<Integer> list = new LinkedList<>(); list.add(3); list.add(1); list.add(7); // ๊ธฐ์กด์ ๋ฐฉ์ (์ต๋ช ํด๋์ค ์ ์ธ) Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer a, Integer b) { return a.compareTo(b); // ์ค๋ฆ์ฐจ์ } }); // ๋๋ค์์ ์ด์ฉ Collections.sort(list, (a, b) -> a.compareTo(b));
Comparator ๋ํ ๋จ ํ๋์ ๋ฉ์๋
compare
๋ง ๊ฐ์ง๋ ํจ์ํ ์ธํฐํ์ด์ค์ด๋ค.
java.util.function
์์ฃผ ์ฌ์ฉ๋๋ ํจ์ํ ์ธํฐํ์ด์ค๋ค์ ์ ๊ณตํ๋ ํจํค์ง
์ด๋ค์ ๋ชจ๋ ๋๋ค์์ด ํ ๋น๋ ์ ์์
์์ฃผ ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค๋ค
Runnable
์ค๋ ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ธํฐํ์ด์ค
void run()
ํจ์๋ง ์ง์
Supplier
๊ณต๊ธ์ ์ญํ ์ ํ๋ ์ธํฐํ์ด์ค
T get()
๋ฉ์๋ ์ง์๋งค๊ฐ๋ณ์(์ ๋ ฅ๊ฐ)๋ ์๊ณ , ๋ฐํ๊ฐ์ ์กด์ฌ
Consumer
์๋น์ ์ญํ ์ ํ๋ ์ธํฐํ์ด์ค
void accept(T t)
๋ฉ์๋ ์ง์๋งค๊ฐ๋ณ์๋ ์๊ณ , ๋ฐํ๊ฐ์ ์์
Function<T, R>
ํจ์ ์์ฒด์ ์ญํ ์ ํ๋ ์ธํฐํ์ด์ค
R apply(T t)
๋ฉ์๋ ์ง์๋งค๊ฐ๋ณ์(t), ๋ฐํ๊ฐ(r) ๋ชจ๋ ํ๋์ฉ ์กด์ฌ
Predicate
์กฐ๊ฑด์์ ํํํ๋๋ฐ ์ฌ์ฉ
๋๋ค์์ ๊ฒฐ๊ณผ(๋ฐํ๊ฐ)๊ฐ boolean์ด์ด์ผ ํจ
boolean test(T t)
๋ฉ์๋ ์ง์์ฌ์ค Predicate๋ test ์ด์ธ์๋ ๋ค์๊ณผ ๊ฐ์ default ๋ฉ์๋๋ฅผ ์ ๊ณตํจ
Predicate<T> negate()
boolean ๊ฒฐ๊ณผ์ NOT ์ฐ์ฐ์ ํ Predicate ๋ฐํ
Predicate<T> and(Predicate p)
๋ค๋ฅธ ๊ฒ๊ณผ and ์ฐ์ฐํ Predicate ๋ฐํ
Predicate<T> or(Predicate p)
๋ค๋ฅธ ๊ฒ๊ณผ or ์ฐ์ฐํ Predicate ๋ฐํ
static Predicate<T> isEqual(Object o)
์ฃผ์ด์ง ๊ฐ์ฒด์ ๊ฐ์์ง๋ฅผ ํ๋ณํ๋ Predicate ๋ฐํ
static ํจ์์์ ์ฃผ์
boolean result = Predicate.isEqual(str1).test(str2);
๋งค๊ฐ๋ณ์๊ฐ 2๊ฐ
BiConsumer<T, U>
void accept(T t, U u)
BiPredicate<T, U>
boolean test(T t, U u)
BiFunction<T, U, R>
R apply(T t, U u)
๋งค๊ฐ๋ณ์ ํ์
๊ณผ ๋ฐํ ํ์
์ด ์ผ์น
UnaryOperator
T apply(T t)
BinaryOperator
T apply(T t, T t)
๋ฉ์๋ ์ฐธ์กฐ (::)
ํ๋์ ๋ฉ์๋๋ง ํธ์ถํ๋ ๋๋ค์์
๋ฉ์๋ ์ฐธ์กฐ
๋ก ์ถ์ฝ ํํ ๊ฐ๋ฅstatic ๋ฉ์๋ ๋๋ ํด๋น ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ์ฐธ์กฐ(ํธ์ถ)
ClassName::method
์์ฑ์ ์ฐธ์กฐ
ClassName::new
Last updated