본문 바로가기

JAVA

람다2

앞에 람다와 스트림1 에서

 

그래서 결론적으로

람다는 익명객체이기 때문에 참조변수에 넣어주어야 한다.

그러기 위해서는 함수형 인터페이스가 필요하다.

 

하는 결론이 나왓는데

 

그에 필요한 람다형 인터페이스를 알아보자.

 

람다식 , 함수형 인터페이스

단 하나의 추상 메서드만 선언된 인터페이스

 

@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;

 }

}

 

참조변수를 함수형 인터페이스로 객체를 생성하고

 

int value = f.max(3,5);

참조변수에서 max 메소드를 호출해서 사용하는 방식이다.

 

함수형 인터페이스 (MyFunction) 의 참조변수로 람다식을 참조할 수 있다.

단 함수형 인터페이스의 메서드와 람다식의 매개변수 갯수의 반환타입이 일치해야 한다.

 

myFunction f = (a,b) -> a > b ? a : b

int value = f.max(3,5); 실제로는 람다식 (익명함수)이 호출된다.

 

결론

1.람다식은 함수형 인터페이스에 꼭 선언되어 있어야한다.

2.함수형 인터페이스에 자세한 함수 내용이 작성되있다.

 

1.함수형 인터페이스 생성

@FunctionalInterface

interface MyFunction2{

 public abstract int max (int a , int b)

}

-추상형 메서드가 있어야한다.

-반환 타입과 매개변수갯수가 중요

 

2. 함수형 인터페이스 객체 생성

MyFunction2 f = 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);

 

익명 객체를 람다식으로 대체 ,

기존

List<String> list = Array.asList("abc" , "aaa" , "bbb" , "ddd" , "aaa")

Collections.sort(list , new Comparator<String>)(){

 public int example (String s1 , String s2) {

  return s2.compareto(s1)

 }

}

위를 함수형인터페이스로 표현하면

@FunctionalInterface

interface CompareTo<T> {

 int compare(t o1 , t o2);

}

함수형 인터페이스는 람다식 사용 가능

 

람다식으로 사용

List<String> list = Array.asList("abc" , "aaa" , "bbb" , "ddd" , "aaa")

Collections.sort(list , (s1,s2) -> s2.compareTo(s1));

 

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

@FunctionalInterface

interface MyFunction{

 void MyMethod():

}

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

void mothod (MyFunction f){

 f.myMethod(); // myFunction  에 정의된 myMethod메서드 호출

}

매개변수로 함수형 인터페이스 즉 , 람다식을 받겠다는것.

 

매개변수로 람다식을 주면 그 람다식을 호출한다.

myFunction f = () -> system::println;

void aMethod(f) ; //람다식 넘겨주기

 

void aMethod(()-> system::println){}

 

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

MyFunction myMethod(){    //함수형 인터페이스가 반환형이란건

 myFunction f = () -> {};  // 람다식을 반환한다는것,

 return f;

}

 

람다를 이용해 줄여주면

MyFunction MyMethod(){

 return () -> {}

}

 

ex)

1.람다 사용을 위해 함수혀 인터페이스 선언

@FunctionalInterface

Interface MyFunction{

 void run(); //추상 메서드 , 매개변수없고 반환타입 없음.

}

 

2.객체 생성, 호출

MyFunction f1 = () -> system.out.println("");

//매개 변수의 갯수와 반환타입이 함수형 인터페이스와 동일

 

3.람다 없이 호출

MyFunction f2 = new MyFunction(){

 public void run(){   //익명 클래스로 run()구현

  system.out.println("f2.run"); //public 이 꼭 있어야 한다 .

 }

}

 

static MyFunction getMyFunction(){ //반환 타입이 함수형 인터페이스인 경우

MyFunction f = () -> system.out.println("f3 run");

retrun f;

}

줄이면 return f = () -> system.out.println("");

 

MyFunction f3 = () -> system.out.println("");

-MyFunction의 반환형을 가지고 있다(람다식)

-f3.에 위 함수를 불러야 하게 떄문에 MyFunction에 추상 메서드명으로 호출

 

f3.run() 반환 값으로 람다식이 오게 된다.

 

람다식이 매개변수

static void execute(myFunction f){

 f.run()

//함수형 인터페이스 (매개변수) 의 추상 메서드 호출

}

 

execute(() -> system.out.println(""));

함수형 인터페이스는 람다식(익명객체)를 지정하기 위한 수단.

'JAVA' 카테고리의 다른 글

람다6 메소드 참조  (0) 2023.03.15
람다5 함수 두개를 연결 andThan  (0) 2023.03.15
람다4 Predicate 람다 조건식  (0) 2023.03.15
람다3 함수형 인터페이스  (0) 2023.03.15
람다1  (0) 2023.03.14