Skip to content

Latest commit

Β 

History

History
160 lines (126 loc) Β· 4.72 KB

Lambda_Expression.md

File metadata and controls

160 lines (126 loc) Β· 4.72 KB

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