[자바의 정석] 14. 람다와 스트림 - 함수형 인터페이스

jyleever·2022년 9월 24일
0

자바의 정석

목록 보기
6/12
post-thumbnail

함수형 인터페이스

  • 하나의 추상 메서드만 선언된 인터페이스
@FunctionalInterface
interface MyFunction {
	public abstract int max(int a, int b);
   }

함수형 인터페이스 구현

  • 익명 클래스 클래스의 선언, 객체 생성이 동시에 이루어진다
MyFunction f = new MyFunction(){
	public int max(int a, int b){
    	return a > b ? a : b;
    }
}

Object타입이 아닌 함수형 인터페이스로 선언 및 구현했기 떄문에 max 함수를 사용할 수 있다!

함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있음

  • 단, 함수형 인터페이스의 메서드와 람다식의 매개변수 개수와 반환 타입이 일치해야 함
MyFunction f = (a, b) -> a > b ? a : b;
int value = f.max(3, 5); // 실제로는 람다식이 호출됨

함수형 인터페이스는 람다식을 사용하기 위해 사용한다

  • 인터페이스의 모든 메소드는 public abstract
  • 따라서 오버라이딩할 때 접근 제어자는 좁게 못 바꾼다 규칙을 지켜야 하므로 인터페이스를 선언 및 객체 생성할 때에 public 접근 제어자를 붙여주어야 한다

예시

class ex{
  public statid void main(String[] args){
      Myfunction2 = new MyFunction2(){
          public int max(int a, int b){
              return a > b ? a : b;
          }
     };

     int value - f.max(3,5); // 함수형 인터페이스
  }
}
@FunctionalInterface
interface MyFunction2{
	//public abstract ...
    int max(int a, int b);
}
class ex{
  public statid void main(String[] args){
      Myfunction2 = new MyFunction2(){
          public int max(int a, int b){
              return a > b ? a : b;
          }
     };
     // 람다식을 다루기 위한 참조변수의 타입은 함수형 인터페이스로 한다
     MyFunction2 f = (a, b) -> a > b ? a : b; // 람다식, 익명 객체

     int value - f.max(3,5); // 함수형 인터페이스
  }
}
@FunctionalInterface
interface MyFunction2{
	//public abstract ...
    int max(int a, int b);
}
  • 함수형 인터페이스의 추상 메서드를 통해 람다식을 호출할 수 있다! 람다식에는 함수명이 없기 때문에

함수형 인터페이스 예시

  • 익명 객체를 람다식으로 대체
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collections.sort(list, new Comparator<String>(){
	public int compare(String s1, String s2){
    	return s2.compareTo(s1);
    }
});

@FunctionalInterface
interface Cmoparator<T>{
	int compare(T o1, T o2);
}

Comparator c = (s1, s2) -> s2.compareTo(s1);
함수형 인터페이스

List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));

함수형 인터페이스 타입의 매개변수, 반환타입

함수형 인터페이스 타입의 매개변수

void aMethod(MyFunction f){
	f.myMethod(); // MyFunction에 정의된 메서드 호출
}

@FunctionalInterface
interface MyFunction{
	void myMethod();
}
MyFunction f = () -> System.out.println("myMethod()");
aMethod(f);

위 문장을 한 줄로

aMethod(() -> System.out.println("myMethod()"));

함수형 인터페이스 타입의 반환 타입

MyFunction myMethod(){
	MyFunction f = () -> {};
    return f;
}

위 문장을 한 줄로

MyFunction myMethod(){
	return () -> {};
}

0개의 댓글