인터페이스 중에서 추상형 메소드(구현해야할 메소드)가 딱 하나 존재하는 인터페이스
- 함수형 인터페이스
인스턴스보다 기능 하나가 필요한 상황을 위한 람다
class SLenComp implements Comparator<String> {
@Override
public int compare (String s1, String s2) {
return s1.length() - s2.length()
}
}
class SLenComparator {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Robot");
list.add("Lambda");
list.add("Box");
Collections.sort(list, new SLenComp()); // 정렬
for(String s : list)
System.out.println(s);
}
}
매개변수가 있고 반환하지 않는 람다식
interface Printable {
void print(String s); // 매개변수 하나, 반환형 패ㅑㅇ
}
class OnePraramNoReturn {
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.");
}
}
메소드 몸체가 둘 이상의 문장으로 이뤄져 있거나, 매개변수의 수가 둘 이상인 경우에는 각각 중괄호와 소괄호의 생략이 불가능하다.
매개변수가 둘 인 람다식 - 소괄호 생략 못함!!
interface Calculate {
void cal(int a, int b); // 매개변수 둘, 반환형 void
}
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); // 이번엔 곱셈이 진행
}
}
매개변수가 있고 반환하는 람다식 1
interface Calculate {
int cal(int a, int b); // 값을 반환하는 추상 메소드
}
class TwoParamAndReturn {
public static void main(String[] args) {
Calculate c;
c = (a, b) -> { return a+b; }; return문의 중괄호는 생략 불가!
System.out.println(c.cal(4, 3));
c = (a, b) -> a+b; 연산 결과가 남으면, 별도로 명시하지 않아도 반환 대상이 됨!
System.out.println(c.cal(4, 3));
}
}
매개변수가 있고 반환하는 람다식 2
interface HowLong {
int len(String s); // 값을 반환하는 메소드
}
class OneParamAndReturn {
public static void main(String[] args) {
HowLong hl = s -> s.length();
System.out.println(hl.len("I am so happy"));
}
}
매개변수가 없는 람다식
interface Generator {
int rand(); // 매개변수 없는 메소드
}
class NoParamAndReturn {
public static void main(String[] args) {
Generator gen = () -> {
Random rand = new Random();
return rand.nextInt(50);
};
System.out.println(gen.rand());
}
}
함수형 인터페이스(Functional Interfaces)와 어노테이션
함수형 인터페이스 : 추상 메소드가 딱 하나만 존재하는 인터페이스
@FunctionalInterface
함수형 인터페이스의 조건을 갖추었는지에 대한 검사를 컴파일러에게 요청!
@FunctionalInterface
interface Calculate {
int cal(int a, int b);
}
@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 Calculate <T> { // 제네릭 기반의 함수형 인터페이스
T cal(T a, T b);
}
class LambdaGeneric {
public static void main(String[] args) {
Calculate<Integer> ci = (a, b) -> a + b;
System.out.println(ci.cal(4, 3));
Calculate<Double> cd = (a, b) -> a + b;
System.out.println(cd.cal(4.32, 3.45));
}
}
인터페이스가 제네릭 기반이라 하여 특별히 신경 쓸 부분은 없다.
타입 인자가 전달이 되면(결정이 되면) 추상 메소드의 T는 결정이 되므로!
'# 02 > Java' 카테고리의 다른 글
[윤성우 열혈자바] 28-1. 메소드 참조 (0) | 2019.10.28 |
---|---|
[윤성우 열혈자바] 27-2. 정의되어 있는 함수형 인터페이스 (0) | 2019.10.25 |
[윤성우 열혈자바] 26-2. 람다의 소개 (0) | 2019.10.25 |
[윤성우 열혈자바] 26-1. 네스티드 클래스와 이너 클래스 (0) | 2019.10.25 |
[윤성우 열혈자바] 25-3. 어노테이션 (0) | 2019.10.25 |