kotlin/java

Lambda 함수(1)

slow333 2023. 1. 6. 18:24

함수를 축약해서 일회용으로 사용하기 위해 만든 함수

Comparator 등에 많이 사용됨

int max(int a, int b) {
  return a >b ? a:b;
}
(a, b) -> a >b ? a: b  // 끝에 ; 없음
int roll() {
return (int) (Math.random()*10;
}
() -> (int) (Math.random()*10
int printVar(String name, int i){
System.out.println(name + "="+i);
}
(a, b) -> System.out.println(a+ "="+b)

기본 적으로 이름이 없어서 원칙적으로 Object로 객체를 만들어야 하나

Object에는 필요한 Method가 없어 interface를 정의해서 함수를 정의해서 사용함

 

@FunctionalInterface

inteface MyFunction {

  int max(int a, int b);   // 기본적으로 public abstract 임. 생략 가능

}

MyFunction mf = (a, b) -> (a > b) ? a:b;

int value = mf(3, 6);

=> java에서 미리 정의한 함수형 인터페이스가 있어 이걸 사용하면 대부분 처리 가능(만들일 없음)

 

Consumer, Supplier, Function 대부분 이 3개면 처리 가능

Consumer => 입력만 있음 (println)

Supplier => 출력만 있음

Function => 입력, 출력

Predicate => boolean으로 출력

위의 것을 다시 구현 하면 다음과 같음(별도로 함수형 인터페이스를 구현할 필요 없음)

 

public class LambdaEx1 {
  public static void main(String[] args) {

    MyFunction mf = (a, b) -> (a > b) ? a : b;
    int value = mf.max(3, 6);

   Function<Integer, Integer> f = a -> a * 100;
   int value1 = (int) f.apply(6);
   Supplier<Integer> s = () -> (int)(Math.random()*9) +1;
   Integer rand = s.get();
   System.out.println(value1+", value : "+ value+", rand : "+rand);

  }
}
@FunctionalInterface
interface MyFunction {
  int max(int a, int b);   // 기본적으로 public abstract 임. 생략 가능
}