순수함수
비상태, 불변성
선언형 함수
1급 객체와 고차 함수
화살표 (->) 기호를 사용하여 람다 표현식을 작성할 수 있다.
ex)
(매개변수목록) -> {실행문;}
ex)
int add(int x, int y) {
return x + y;
}
// 람다식으로 표현 하기
(int x, int y) -> {return x + y;}
str -> {System.out.println(str);}
// 매개변수가 여러개인 경우는 괄호를 생략할 수 없습니다.
x,y -> {System.out.println(x + y)}; // 잘못된 형식
str -> System.out.println(str);
(x, y) -> x + y // 두 값을 더하여 반환함
str -> str.length() // 문자열 길이를 반환 함
람다식은 메소드 이름이 없고 메소드를 실행하는데 필요한 매개변수와 매개변수를 활용한 실행 코드를 구현하는 것이다. 함수형 언어는 함수만 따로 호출할 수 있지만 자바는 참조변수 없이 메소드를 호출할 수 없기 때문에 람다식을 구현하기 위해 함수형 인터페이스를 만들고 인터페이스에 람다식으로 구현할 인터페이스를 선언해야한다.
참조변수의타입 참조변수의이름 = 람다표현식
위의 문법처럼 람다표현식을 하나의 변수에 대입할 때 사용하는 참조 변수의 타입을 함수형 인터페이스라고 한다.
함수형 인터페이스는 추상 클래스와 달리 단 하나의 추상 메소드만을 가져야 한다.
(@FunctionalInterface 어노테이션을 사용하여 함수형 인터페이스임을 명시할 수 있음)
ex)
interface Calculator {
int sum(int a, int b);
}
public class Sample {
public static void main(String[] args) {
Calculator mc = (int a, int b) -> a + b; // 인터페이스 상속을 받아서 클래스 대신 람다
int result = mc.sum(3, 4);
System.out.println(result);
}
}
@FunctionalInterface
interface MyFuncInterface {
public void method(int x);
}
public class LambdaMainEx {
public static void main(String[] args) {
MyFuncInterface fi = (x) -> {
int result = x * 5;
System.out.println(result);
};
fi.method(2);
}
}
@FunctionalInterface
interface MyFuncInterface { // 함수형 인터페이스의 선언
public int min(int x, int y); // 매소드가 반드시 한개만 존재
}
public class LambdaEx2 {
public static void main(String[] args) {
MyFuncInterface fi = (x, y)-> x < y ? x : y; // 구현부
System.out.println(fi.min(3, 4)); // 호출부
}
}
public static void main(String[] args) {
IntBinaryOperator operator;
//정적 메소드 참조 ---------------------------------
operator = (x, y) -> Calculator.staticMethod(x, y);
System.out.println("결과1: " + operator.applyAsInt(1, 2));
operator = Calculator :: staticMethod;
System.out.println("결과2: " + operator.applyAsInt(3, 4));
//인스턴스 메소드 참조 ---------------------------
Calculator obj = new Calculator();
operator = (x, y) -> obj.instanceMethod(x, y);
System.out.println("결과3: " + operator.applyAsInt(5, 6));
operator = obj :: instanceMethod;
System.out.println("결과4: " + operator.applyAsInt(7, 8));
}
public class Calculator {
public static int staticMethod(int x, int y) {
return x + y;
}
public int instanceMethod(int x, int y) {
return x + y;
}
}