2018-6-27 Java8 람다
람다함수
interface Printable {
void print(String s);
}
public class OneParamNoReturn {
public static void main(String[] args) {
Printable p;
p = (String s) -> {
System.out.println(s);
};
p.print("Lambda exp one.");
p = (String s) -> System.out.println(s); // 중괄호 생략
p.print("Lambda exp two.");
p = (s) -> System.out.println(s); // 매개변수 생략
p.print("Lambda exp three.");
p = s -> System.out.println(s); // 매개변수 소괄호 생략
p.print("Lambda exp four");
}
}
- 메소드의 몸체가 하나의 문장이면 중괄호 생략 가능하다.
- 중괄호를 생략하면 끝에 위치한 세미콜론도 생략해야한다.
- 매개변수가 하나이면 매개변수 소괄호도 생략이 가능하다.
매개변수가 2개이고 리턴타입이 void
interface Calculate {
void cal(int a, int b); // 매개변수 2개, 반환형 void
}
public class TwoParamNoReturn {
public static void main(String[] args) {
Calculate c;
c = (a, b) -> System.out.println(a + b);
c.cal(4,3); // 덧셈진행
c = (a, b) -> System.out.println(a - b);
c.cal(4,3); // 뺄셈진행
c = (a, b) -> System.out.println(a * b);
c.cal(4,3); // 곱셈진행
}
}
매개변수가 있고 리턴타입이 있는 람다식
interface Calculate2 {
int cal(int a, int b);
}
public class TwoParamAndReturn {
public static void main(String[] args) {
Calculate2 c;
c = (a, b) -> { return a + b; };
System.out.println(c.cal(4, 3));
c = (a, b) -> a + b;
System.out.println(c.cal(4, 3));
}
}
- 몸체에 해당하는 부분이 return문이면 중괄호 생략이 불가능하다. 하지만 (a,b) -> a + b;는 가능하다.
package chapter27;
interface HowLong {
int len(String s);
}
public class OneParamAndReturn {
public static void main(String[] args) {
HowLong h1 = s -> s.length();
System.out.println(h1.len("I'm so happy"));
}
}
//result
12
매개변수가 없는 람다식
interface Generator {
int rand(); // 매개변수 없는 메소드
}
public class NoParamAndReturn {
public static void main(String[] args) {
Generator gen = () -> {
Random rand = new Random();
return rand.nextInt(50);
};
System.out.println(gen.rand());
}
}
//result
16
- 매개변수 선언이 없는 관계로 매개변수 정보를 담는 소괄호는 비어있다.
- 둘 이상의 문장으로 이루어진 람다식에는 중괄호가 필요, 값을 반환할 때도 return문이 필요하다.
함수형 인터페이스와 어노테이션
- 인터페이스에 추상 메소드가 딱 하나만 존재하는 인터페이스를 함수형 인터페이스라고 한다.
@FunctionalInterface
interface Calculate {
int cal(int a, int b);
}
- @FunctionalInterface는 함수형 인터페이스에 부합한지를 확인하기 위한 어노테이션이다.
- 이러한 인터페이스에 둘 이상의 추상메소드가 존재하면, 컴파일에러가 발생한다.
- 그러나 static, default선언이 붙은 메소드 정의가 있으면 아무런 영향을 미치지 않기때문에 함수형인터페이스로 분류가 된다.
@FunctionalInterface
interface Calculate {
int cal(int a, int b);
default int add(int a, int b) { return a + b; }
static int sub(int a, int b) { return a - b; }
}
람다식과 제네릭
@FunctionalInterface
interface Calculate3 <T> { //제네릭기반 함수형 인터페이스
T cal(T a, T b);
}
public class LambdaGeneric {
public static void main(String[] args) {
Calculate3<Integer> ci = (a, b) -> a + b;
System.out.println(ci.cal(4, 3));
Calculate3<Double> cd = (a, b) -> a + b;
System.out.println(cd.cal(4.32, 3.45));
}
}
//result
7
7.7700000000000005
- 위의 두 메소드에서 참조변수의 자료형이 다른관계로 서로다른 인스턴스의 생성으로 이어진다.
Written on June 27, 2018