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