728x90
익명 클래스 기법은 람다식과 자주 사용된다.
Operate operate = new Operate() {
public int operate(int a, int b) {
return a + b;
}
};
// 람다식으로 줄이기
Operate operate = (a, b) -> {
return a + b;
};
// 더 짧게 줄이기 (리턴 코드만 있다면 생략이 가능)
Operate operate = (a, b) -> a + b;
operate.operate(3,5); // Error!
자바에서 람다식은 익명함수가 아니라 익명 객체이다.
operate.operate(3,5); 를 호출하면 에러가 나는 이유는?
자바에서 메소드는 무조건 객체 안에 들어가 있어야한다!
람다식 표현의 익명 구현객체는 제약이 존재한다.
함수형 인터페이스로만 구현이 가능하다는 점!
@FunctionalInterface
함수형 인터페이스 : 추상메서드가 오직 하나인 인터페이스를 의미
default, static 메소드는 여러개 존재가능
java8 부터 인터페이스는 기본 구현체를 포함한 디폴트 메서드를 포함할 수 있다.
어노테이션을 사용하여 함수형 인터페이스 조건에 맞는지 검사할 수 있다.
사용법
@FunctionalInterface
public interface Operate {
int operate(int a, int b);
// 인터페이스의 모든 메소드는 예외없이 public이면서 abstact이기에 생략 가능
// default 메서드는 추상 메서드에 포함되지 않는다
default void print() {
System.out.println("출력");
}
}
Operate operate = (a, b) -> {
print();
return a + b;
};
Operate operate = (a, b) -> a + b;
익명 객체 -> 람다식으로 대체
sort함수는 sort(List list, Comparator c) 이렇게 선언되어 있음.
Comparator가 @FunctionalInterface로 되어있으므로, 람다가 들어가도 가능함
📍 익명객체 표현
List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd);
Collections.sort(list, new Comparator<String> (){
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}
});
📍 람다식
List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd);
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
참조:
728x90
'Language > Java' 카테고리의 다른 글
[Java] Iterator 정리 / Map , ArrayList, Set에서의 iterate 사용법 (0) | 2023.02.02 |
---|---|
[Java] Hashmap 정렬방법 (0) | 2023.02.01 |
[Java] 익명함수 (익명 자식 객체, 익명 구현 객체) (0) | 2023.01.31 |
[Java] 오버로딩 & 오버라이딩 Overloading / Overriding (0) | 2023.01.31 |
[ JAVA ] Comparable과 Comparator (0) | 2021.08.06 |