English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
람다 표현식 또는 클로저는 Java를 8 최신으로 출시된 가장 중요한 새로운 기능입니다.
람다는 함수를 메서드의 매개변수로 사용할 수 있습니다(함수를 메서드에 전달합니다).
람다 표현식을 사용하면 코드가 더 간결하고 긴밀해집니다.
람다 표현식의 문법 형식은 다음과 같습니다:
(parameters) -> expression 또는 (parameters) -{ statements; }
이는 람다 표현식의 중요한 특징입니다:
선택적 타입 선언:매개변수 타입을 선언하지 않아도 됩니다. 컴파일러는 매개변수 값을 일반적으로 인식할 수 있습니다.
선택적 매개변수 대括호:한 개의 매개변수는 대括호를 정의하지 않아도 됩니다. 다수의 매개변수는 대括호를 정의해야 합니다.
선택적 대括호:주체에 하나의 문이 포함되어 있다면 대括호를 사용하지 않아도 됩니다.
선택적 반환 키워드:주체가 하나의 표현식으로 반환 값을 가지고 있다면 컴파일러는 자동으로 반환 값을 반환하고, 표현식이 수치 값을 반환하는 것을 명시하기 위해 대括호가 필요합니다.
Lambda 표현식의 간단한 예시:
// 1. 매개변수가 필요하지 않음, 반환 값은 5 ()) -> 5 // 2. 수신하며 매개변수(숫자형)를 받아서 그의2배의 값 x -> 2 * x // 3. 수신2개의 매개변수(숫자)를 받아서 그들의 차를 반환 (x, y) -> x - y // 4. 수신2개의 int형 정수를 받아서 그들의 합을 반환 (int x, int y) -> x + y // 5. 수신하며 string 객체를 받아서 컨솔에 출력하고, 어떤 값도 반환하지 않음(void로 보이는 것처럼) (String s) -> System.out.print(s)
Java에서8Tester.java 파일에 다음 코드를 입력하세요:
public class Java8Tester { public static void main(String args[]){ Java8Tester tester = new Java8Tester(); // 타입 선언 MathOperation addition = (int a, int b) -> a + b; // 타입 선언 사용하지 않음 MathOperation subtraction = (a, b) -> a - b; // 대括호 내의 반환 문 MathOperation multiplication = (int a, int b) -> { return a * b; }; // 대括호와 반환 문 없음 MathOperation division = (int a, int b) -> a / b; System.out.println("10 + 5 = " + tester.operate(10, 5, addition)); System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction)); System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication)); System.out.println("10 / 5 = " + tester.operate(10, 5, division)); // 사용하는 괄호 GreetingService greetService1 = message -> System.out.println("Hello " + message); // 사용하지 않는 괄호 GreetingService greetService2 = (message) -> System.out.println("Hello " + message); greetService1.sayMessage("w3codebox greetService2.sayMessage("Google"); } interface MathOperation { int operation(int a, int b); } interface GreetingService { void sayMessage(String message); } private int operate(int a, int b, MathOperation mathOperation) { return mathOperation.operation(a, b); } }
이 스크립트를 실행하면 출력 결과는 다음과 같습니다:
$ javac Java8Tester.java $ java Java8Tester 10 + 5 = 15 10 - 5 = 5 10 x 5 = 50 10 / 5 = 2 Hello w3codebox Hello Google
라ム다 표현식을 사용할 때 유의해야 할 두 가지 사항은 다음과 같습니다:
라ム다 표현식은 주로 행내에서 실행할 수 있는 메서드 타입 인터페이스를 정의하는 데 사용됩니다. 예를 들어, 간단한 메서드 인터페이스입니다. 이 예제에서는 MathOperation 인터페이스의 메서드를 정의하기 위해 다양한 형태의 라ム다 표현식을 사용했습니다. 그런 다음 sayMessage의 실행을 정의했습니다.
라ム다 표현식은 익명 메서드 사용의 번거로움을 없애고, Java에 간단하지만 강력한 함수화된 프로그래밍 능력을 제공합니다.
라ム다 표현식은 final로 표시된 바깥 층의 지역 변수만 참조할 수 있습니다. 즉, 라ム다 내에서 외부에서 정의된 지역 변수를 변경할 수 없으며, 이렇게 하면 컴파일 오류가 발생합니다.
Java에서8Tester.java 파일에 다음 코드를 입력하세요:
public class Java8Tester { final static String salutation = "Hello! "; public static void main(String args[]){ GreetingService greetService1 = message -> System.out.println(salutation + message); greetService1.sayMessage("w3codebox } interface GreetingService { void sayMessage(String message); } }
이 스크립트를 실행하면 출력 결과는 다음과 같습니다:
$ javac Java8Tester.java $ java Java8Tester Hello! w3codebox
라ム다 표현식에서 바깥 층의 지역 변수를 직접 접근할 수도 있습니다:
public class Java8Tester { public static void main(String args[]) { final int num = 1; Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num)); s.convert(2); // 출력 결과는 3 } public interface Converter<T1, T2> { void convert(int i); } }
라ム다 표현식의 지역 변수는 final로 선언하지 않아도 됩니다만, 이후 코드에서 수정되지 않아야 합니다(즉, 은닉된 final 의미를 가집니다)
int num = 1; Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num)); s.convert(2); num = 5; //에러 메시지: Local variable num defined in an enclosing scope must be final or effectively final
Lambda 표현식에서는 동일 이름의 매개변수나 지역 변수를 선언할 수 없습니다.
String first = ""; Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length()); //컴파일 중 오류가 발생할 수 있습니다