//기존 메서드 표현 방식
void sayhello(){
System.out.println("HELLO");
}
//람다식으로 표현
() -> System.out.println("HELLO");
람다식에서는 기본적으로 반환 타입과 이름 생략 가능
ex.
void, sayhello 생략
따라서 람다함수를 익명 함수 anonymous function이라 부르기도 함
ex1.
int sum(int num1, int num2){
return num1+num2;
}
람다식으로 변경(반환 타입, 이름 생략)
(int num1, int num2) -> {
return num1+num2;
}
ex2.
void example1(){
Systme.out.printnl(5)
}
람다식으로 변경(반환 타입, 이름 생략)
() -> {return 5;}
ex3.
int example2(){
return 10;
}
람다식으로 변경(반환 타입, 이름 생략)
() -> {return 10;}
ex4.
void example3(String str){
System.out.println(str);
}
람다식으로 변경(반환 타입, 이름 생략)
(String str) -> {System.out.println(str);}
특정 조건이 충족시 더 축약 가능
//기존 방식
int sum(int num1, int num2){
return num1+num2;
}
//람다식 축약1
(int num1, int num2)->{
num1+num2
}
//람다식 축약2
(int num1, int num2) -> num1+num2
//람다식 축약3 : 매개변수 타입을 함수형 인터페이스를 통해 유추할 수 있는 경우 매개변수 타입 생략 가능
(num1, num2) -> num1+num2
자바에서 함수는 반드시 클래스 안에 정의되어야 하기 때문에 메서드가 독립적으로 있을 수 없고,
반드시 클래스 객체를 먼저 생성한 후 생성한 객체로 메서드를 호출해야 함
//람다식
(num1, num2) -> num1+num2
//람다식을 객체로 표현
new Object(){
int sum(int num1, int num2){
return num1+num2;
}
}
//
:sum 메서드는 이름 없는 익명 객체임
? 익명객체?
:익명 객체는 익명 클래스를 통해 만들 수 있음
? 익명 클래스?
:객체의 선언과 생성을 동시에 하여
오직 하나의 객체를 생성하고
단 한번만 사용되는 일회용 클래스
이 람다식이 객체라고 한다면, 이 객체에 접근하고 상용하기 위한 참조 변수가 필요
그런데 기존에 객체를 생성할 때 만들었던 Object 클래스에는 sum이라는 메서드가 없기 때문에
Object 타입의 참조 변수에 담는다고 하더라도 sum 메서드를 사용할 수 없음
public class LamdaExample1 {
public static void main(String[] args) {
// 람다식 Object obj = (num1, num2) -> num1 + num2; 로 대체 가능
Object obj = new Object() {
int sum(int num1, int num2) {
return num1 + num1;
}
};
obj.sum(1, 2);
}
}
출력 결과
java: cannot find symbol
symbol: method sum(int,int)
location: variable obj of type java.lang.Object
:이러한 문제를 해결하기 위해 사용하는 자바의 문법 요소 = 자바의 함수형 인터페이스(Functional Interface)
? 함수형 인터페이스?
:한개의 추상 메서드만 선언된 인터페이스
public class LamdaExample1 {
public static void main(String[] args) {
/* Object obj = new Object() {
int sum(int num1, int num2) {
return num1 + num1;
}
};
*/
ExampleFunction exampleFunction = (num1, num2) -> num1 + num2;
System.out.println(exampleFunction.sum(10,15));
}
@FunctionalInterface // 컴파일러가 인터페이스가 바르게 정의되었는지 확인하도록 합니다.
interface ExampleFunction {
int sum(int num1, int num2);
}
// 출력값
25
:위의 예제에서 함수형 인터페이스인 ExampleFunction에 추상메서드 sum()이 정의되어져 있습니다. 이 함수형 인터페이스는 람다식을 참조할 참조변수를 선언할 때, 타입으로 사용하기 위해 필요합니다.
함수형 인터페이스 타입으로 선언된 참조변수 exampleFunction에 람다식이 할당되었으며, 이제 exampleFunction을 통해 sum() 메서드를 호출할 수 있습니다.
이처럼, 함수형 인터페이스를 사용하면 참조변수의 타입으로 함수형 인터페이스를 사용하여 우리가 원하는 메서드에 접근이 가능합니다.
<노이해중>
함수형 인터페이스
@FunctionalInterface
public interface MyFunctionalInterface {
void accept();
}
람다식 표현
MyFunctionalInterface example = () -> { ... };
// example.accept();
@FunctionalInterface
interface MyFunctionalInterface {
void accept();
}
public class MyFunctionalInterfaceExample {
public static void main(String[] args) throws Exception {
MyFunctionalInterface example = () -> System.out.println("accept() 호출");
example.accept();
}
}
// 출력값
accept() 호출
함수형 인터페이스
@FunctionalInterface
public interface MyFunctionalInterface {
void accept(int x);
}
public class MyFunctionalInterfaceExample {
public static void main(String[] args) throws Exception {
MyFunctionalInterface example;
example = (x) -> {
int result = x * 5;
System.out.println(result);
};
example.accept(2);
example = (x) -> System.out.println(x * 5);
example.accept(2);
}
}
// 출력값
10
10
:추상 메서드 accept()가 매개변수를 한개만 가짐
함수형 인터페이스
@FunctionalInterface
public interface MyFunctionalInterface {
int accept(int x, int y);
}
public class MyFunctionalInterfaceExample {
public static void main(String[] args) throws Exception {
MyFunctionalInterface example;
example = (x, y) -> {
int result = x + y;
return result;
};
int result1 = example.accept(2, 5);
System.out.println(result1);
example = (x, y) -> { return x + y; };
int result2 = example.accept(2, 5);
System.out.println(result2);
example = (x, y) -> x + y;
//return문만 있을 경우, 중괄호 {}와 return문 생략가능
int result3 = example.accept(2, 5);
System.out.println(result3);
example = (x, y) -> sum(x, y);
//return문만 있을 경우, 중괄호 {}와 return문 생략가능
int result4 = example.accept(2, 5);
System.out.println(result4);
}
public static int sum(int x, int y){
return x + y;
}
}
//출력값
7
7
7
7