[Java] - Lambda Expression은 어디에, 어떻게 사용되는가?

Lofo·2021년 5월 2일
0

Java

목록 보기
2/5
post-thumbnail

람다식을 어디에 사용할 수 있는가?

람다식은 functional interface가 있어야 될 자리면 모두 사용할 수 있다.
=> 이때 functional interface를 target type이라고 하며, 컴파일시 target type에 맞춰서 람다식이 해석되어진다.

  • 변수 선언, 대입 그리고 배열 초기화(array initializers?)
  • Method 또는 constructor 매개변수
  • Return statements
  • Cast expressions
  • Ternary conditional expressions(?:)
    output = (x > y) ? (event) -> system.out.println("yes") : "no"

주로 어떤 용도로 사용되는가?

  • High-order functions
  • Implementing callbacks
  • Instead of anonymous inner classes
  • In stream operations

예시

  • High-order functions
    - HOF라고 하는데, 함수를 인자로 전달 받거나 함수를 결과로 반환하는 함수를 의미한다. 참고
	interface MyFunction{
 		double apply(double x);
   	}
	double integral(MyFunction f, double a, double b, int n){
	     int i;
	     double sum = 0;
     	     double dt = (b - a)/n;
     	     for(i = 0; i < n; ++i){
        	sum += f.apply(a + (i +0.5)*dt);
             }
             return sum*dt;
         }
	r = integral(x -> x*x, 0, 1, 100)
	r = integral(x -> x*x*x, 0, 1, 100)
  • Implementing callbacks
    - callback은 콜벡함수라고, 다른 함수의 인자로 활용되는 함수 혹은 다른 함수에 의해서 호출되는 함수를 의미한다. 참고
	Timer t = new Timer(1000, event -> System.out.println("the time is" + new Date()));
   	//Timer 생성자의 인자로 람다식이 전달하고 있다.
 	//그리고 이 람다식을 callback함수로도 해석할 수 있다.
  • Annnonymous Inner Class
    - 자바에서 람다식을 제공하기 이전에는 이 방식으로 주로 했다고 한다. 자바8부터 람다식을 제공한 이후에는 대체되었다고 한다. Annnonymous Inner Class에 대해서는 후에 Nested Class에 대해서 다룰 때 더 깊이 다룬다. 어떻게 작동하는지만 대충 알고 넘어가자.
	interface IntConsumer{
    		double accept(int x);
        }
	void repeat(int n, IntConsumer action){
    		for(i=0; i<n; i++) action.accept(i);
    	}
	//Annnonymous Inner Class
	repeat(10,
		new Intconsumer(){
    			public double accept(int x){
     		   	System.out.println("Countdown: "+(10-x));
    		    }
 		});
	//Lambda Expression
	repeat(10, x -> System.out.println("Countdown: "+(10-x));
  • Stream Operations
    - 이 내용은 이후에 자세히 다룰 기회가 있다고 한다. 어떻게 작동하는지만 대충 알고 넘어가자.
	Interger[] values = {2, 9, 5, 0, 3, 7, 1, 4, 8, 6};
    ...
	System.out.println(
		Arrays.stream(values)
        		.filter(value -> value > 4) //Lambda expression을 통해 4보다 큰 것만 필터링하고 있다.
                	.sorted()
                    	.collect(Collectors.toList())); //결과: [5, 6, 7, 8, 9]
profile
Love God, Love People, Love Code.

0개의 댓글