Lamda

JDK 8 (Java Development Kit 8) μ—μ„œ μ œκ³΅ν•˜λŠ” λžŒλ‹€ ν‘œν˜„μ‹ (Lamda Expression) 을 닀룬닀.

λžŒλ‹€ ν‘œν˜„μ‹μ€ κ³ μ°¨ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ 더 μ‰½κ²Œ ν”„λ‘œκ·Έλž˜λ° ν•  수 μžˆλ‹€.

Exmaple

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

Case 1

λͺ¨λ“  수λ₯Ό ν•©μΉ˜κΈ°

public int sumAll(List<Integer> numbers) {
  int total = 0;
  for (int number : numbers) {
    total += number;
  }

  return total;
}

짝수만 λ”ν•˜κΈ°

public int sumEven(List<Integer> numbers) {
  int total = 0;
  for (int number : numbers) {
    if (number % 2 == 0) {
      total += number;
    }
  }

  return total;
}

Case 2 : λžŒλ‹€ ν‘œν˜„μ‹μ„ 이용

public int sumAll(List<Integer> numbers, Predicate<Integer> p) {
  int total = 0;
  for (int number : numbers) {
    if (p.test(number)) {
      total += number;
    }
  }

  return total;
}

λ‚΄λΆ€μ—μ„œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μΈ Predicate 의 인자λ₯Ό λ°›μ•„ κ²°κ³Όλ₯Ό 인자둜 λ°˜ν™˜ν•˜λŠ” κ³ μ°¨ν•¨μˆ˜μ˜ 방식 을 μ‚¬μš©ν•œλ‹€. (JS 의 μΌκΈ‰κ°μ²΄μ˜ 속성과 μœ μ‚¬ν•¨)

// λͺ¨λ“ μˆ˜λ₯Ό 더함
sumAll(numbers, n -> true);
// 짝수만 더함
sumAll(numbers, n -> n % 2 == 0);
// ν™€μˆ˜λ§Œ 더함
sumAll(numbers, n -> n % 2 == 1);

lamda 의 νŠΉμ§•

μžλ°”μ˜ λžŒλ‹€λŠ” 읡λͺ… ν΄λž˜μŠ€μ™€ μœ μ‚¬ν•˜κ²Œ μ‚¬μš©λ˜μ§€λ§Œ κΈ°μˆ μ μœΌλ‘œλŠ” 차이가 μžˆμŠ΅λ‹ˆλ‹€.

  • 읡λͺ… ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성해야 ν•˜μ§€λ§Œ, ν•¨μˆ˜λŠ” ν‰κ°€λ λ•Œλ§ˆλ‹€ μƒˆλ‘œ μƒμ„±λ˜μ§€ μ•ŠλŠ”λ‹€.
  • ν•¨μˆ˜λ₯Ό μœ„ν•¨ λ©”λͺ¨λ¦¬ 할당은 Java Heap μ˜μ—­μ˜ Permanent μ˜μ—­μ— ν•œλ²ˆ μ €μž₯λœλ‹€.
  • κ°μ²΄λŠ” 데이터와 λ°€μ ‘ν•˜κ²Œ μ—°κ΄€ν•΄μ„œ λ™μž‘ν•˜λŠ”λ° λ°˜ν•΄ ν•¨μˆ˜λŠ” 데이터와 λΆ„λ¦¬λ˜μ–΄ μžˆλ‹€.
  • μƒνƒœλ₯Ό λ³΄μ‘΄ν•˜μ§€ μ•Šμ•„ μ—¬λŸ¬λ²ˆ μ μš©ν•΄λ„ κ²°κ³Όκ°€ 달라지지 μ•ŠλŠ”λ‹€. (λ©±λ“±μ„±)
  • 클래슀의 static method 와 μœ μ‚¬ν•œ κ°œλ…μ΄λ‹€.

λ©±λ“±μ„± : μ—°μ‚°μ˜ μ„±μ§ˆμœΌλ‘œ μ—¬λŸ¬λ²ˆ μ μš©ν•˜λ„ κ²°κ³Όκ°€ λ™μΌν•˜μ—¬ 달라지지 μ•ŠλŠ” μ„±μ§ˆμ„ λ§ν•œλ‹€.

λžŒλ‹€μ‹μ˜ ν˜•νƒœλŠ” λ§€κ°œλ³€μˆ˜λ₯Ό 가진 μ½”λ“œ λΈ”λŸ­ 이기 λ•Œλ¬Έμ— 마치 μžλ°”μ˜ λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λŠ”κ²ƒμ²˜λŸΌ λ³΄μ—¬μ§‘λ‹ˆλ‹€.

μžλ°”λŠ” λ©”μ„œλ“œλ₯Ό λ‹¨λ…μœΌλ‘œ μ„ μ–Έν•  수 μ—†κ³  항상 클래슀의 κ΅¬μ„±λ©€λ²„λ‘œ μ„ μ–Έν•˜κΈ° λ•Œλ¬Έμ— λžŒλ‹€μ‹μ€ λ‹¨μˆœνžˆ λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λŠ” 것이 μ•„λ‹Œ λ©”μ„œλ“œλ₯Ό κ°€κ³  μžˆλŠ” 객체λ₯Ό 생성 ν•΄ λ‚Έλ‹€.

λžŒλ‹€μ‹μ€ FunctionalInterface 을 가지고 μ‚¬μš©ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— Functional Interface λ‚΄μš©μ„ μ°Έκ³ ν•˜μž.