λžŒλ‹€μ‹μ΄λž€

Runnable runnable = new Runnable() {
  public void run() {...};
};

// same
Runnable runnable = () -> {...};

κΈ°λ³Έ 문법

// λ§€κ°œλ³€μˆ˜λͺ…은 자유둭게 쀄 수 μžˆλ‹€
(int a) -> {System.out.println(a)};

// νƒ€μž…μ€ λŸ°νƒ€μž„ μ‹œ λŒ€μž…λ˜λŠ” 값에 따라 μžλ™ 인식될 수 μžˆλ‹€
// λ”°λΌμ„œ 맀개 λ³€μˆ˜ νƒ€μž…μ€ 일반적으둜 μƒλž΅λœλ‹€
(a) -> {System.out.println(a)};

// ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜λ§Œ μžˆλ‹€λ©΄ ()λ₯Ό μƒλž΅ν•  수 μžˆλ‹€
// ν•˜λ‚˜μ˜ μ‹€ν–‰λ¬Έλ§Œ μžˆλ‹€λ©΄ {}λ₯Ό μƒλž΅ν•  수 μžˆλ‹€
a -> System.out.println(a);

// 리턴문이 μžˆλ‹€λ©΄, μ•„λž˜μ™€ 같이 μ“Έ 수 μžˆλ‹€
(x, y) -> {return x + y};

// 싀행문에 return문만 μžˆλŠ” 경우, return을 μƒλž΅ν•˜κ³  μ•„λž˜μ™€ 같이 μž‘μ„±ν•  수 μžˆλ‹€
(x, y) -> x + y;

νƒ€κ²Ÿ νƒ€μž…κ³Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€

@FuntionalInterface

// 두 개 μ΄μƒμ˜ 좔상 λ©”μ†Œλ“œκ°€ μ„ μ–Έλ˜λ©΄ 컴파일 였λ₯˜ λ°œμƒ μ‹œν‚€λŠ” μ–΄λ…Έν…Œμ΄μ…˜
@FunctionalInterface
public interface Example {
  public void method1();
  public void method2(); // complie error
}

맀개 λ³€μˆ˜μ™€ 리턴값이 μ—†λŠ” λžŒλ‹€μ‹

@FunctionalInterface
public interface Example {
  public void method();
}

public class Main {
  public static void main(String[] args) {
    Example e;
    
    e = () -> {
      String str = "1";
      System.out.println(str);
    };
    e.method();

    e = () -> { System.out.println("2")};
    e.method();

    e = () -> System.out.println("3");
    e.method();
  }
}

맀개 λ³€μˆ˜κ°€ μžˆλŠ” λžŒλ‹€μ‹

@FunctionalInterface
public interface Example {
  public void method(int x);
}

public class Main {
  public static void main(String[] args) {
    Example e;
    
    e = (x) -> {
      int result = x * 5;
      System.out.println(result);
    };
    e.method(1);

    e = (x) -> { System.out.println(x * 5)};
    e.method(2);

    e = x -> System.out.println(x * 5);
    e.method(3);
  }
}

리턴 값이 μžˆλŠ” λžŒλ‹€μ‹

@FunctionalInterface
public interface Example {
  public int method(int x, int y);
}

public class Main {
  public static void main(String[] args) {
    Example e;
    
    e = (x, y) -> {
      int result = x * y;
      return result;
    };
    System.out.println(e.method(1, 2));

    e = (x, y) -> { return x * y};
    System.out.println(e.method(1, 2));

    e = (x, y) -> x * y;
    System.out.println(e.method(1, 2));

    e = (x, y) -> multiply(x, y);
    System.out.println(e.method(1, 2));
  }

  public static int multiply(int x, int y) {
    return x * y;
  }
}
@FunctionalInterface
public interface Example {
  public int method(int x, int y);
}

public class Main {
  public static void main(String[] args) {
    Example e;
    
    e = (x, y) -> {
      int result = x * y;
      return result;
    };
    System.out.println(e.method(1, 2));

    e = (x) -> { return x * y};
    System.out.println(e.method(1, 2));

    e = x -> x * y;
    System.out.println(e.method(1, 2));
  }
}

클래슀 멀버와 둜컬 λ³€μˆ˜ μ‚¬μš©

클래슀의 멀버 μ‚¬μš©

@FunctionalInterface
public interface FInterface {
  public void method();
}

public class ThisExample{
  public int outterField = 10;

  class Inner {
    int innerField = 20;

    void foo() {
      FInterfce test = () -> {
        System.out.println("outterField: " + outterField);
        System.out.println("outterField: " + ThisExample.this.outterField); // λ°”κΉ₯ 객체 μ°Έμ‘°

        System.out.println("outterField: " + innerField);
        System.out.println("outterField: " + this.innerField); // λžŒλ‹€μ‹ λ‚΄λΆ€μ—μ„œ thisλŠ” inner 객체 μ°Έμ‘°
      };
      test.method();
    }
  }
}

public class Main {
  public static void main(String[] args) {
    ThisExample example = new ThisExample();
    ThisExample.Inner inner = example.new Inner();
    inner.foo();
  }
}

둜컬 λ³€μˆ˜ μ‚¬μš©

@FunctionalInterface
public interface FInterface {
  public void method();
}

public class VariableExample{
  void foo(int arg) {
    int localVar = 40;

    // arg = 31; // final νŠΉμ„± λ•Œλ¬Έμ— μˆ˜μ • λΆˆκ°€
    // localVar = 41; // final νŠΉμ„± λ•Œλ¬Έμ— μˆ˜μ • λΆˆκ°€

    FInterface test = () -> {
      System.out.println("arg: " + arg);
      System.out.println("localVar: " + localVar);
    };
    test.method();
  }
}

public class Main {
  public static void main(String[] args) {
    VariableExample vExample = new VariableExample();
    vExample.method(20);
  }
}

See Also

Oracle Java Tutorial