JAVA - 0705 Lambda

이진성·2021년 7월 5일
0

0705 JAVA

Lambda Expression in JAVA

Why use Lambda in JAVA ?

--> 코드가 매우 간결해진다.
--> 컬렉션 요소(대용량 데이터)를 필터링 또는 매핑해 쉽게 집계

람다식에서 우선 알아야 할 개념

  1. 함수적 인터페이스(Functional Interface)란..
  • 오직 단 하나의 추상메소드를 가진 인터페이스를 의미

  • 인터페이스에 올 수 있는 멤버 4가지 중에 추상메소드(abstract)를 제외한 나머지 멤버는 올 수 있다.

  • @FunctionalInterface 붙어있는 인터페이스를 의미
    (단, 이 어노테이션이 없다고 해서, 추상메소드가 오직 1개 뿐인 인터페이스가 functional이 아닌것은 아니다!)

  1. 람다식이 구현할 함수적 인터페이스를 => 이 람다식의 "타겟타입" 이라고 한다.

JAVA는 람다식을 함수적 인터페이스의 익명구현객체로 취급

람다식 -> 매개변수를 가진 코드 블록 -> 익명 구현 객체

람다식 코드 작성법runnable

Runnable  = (매개변수) -> {  }; 
 	    (타입의 매개변수) -> { 실행문 };
	    (int a) -> {System.out.println(a)};

- 1. 람다식 구현

MyFunctionalInterface fi = () -> {
	String str = "method call 1";
	log.info(str);
};

- 2.익명구현객체코딩 기법

MyFunctionalInterface fi = new MyFunctionalInterface() {			
	@Override
	public void method() {
		String str = "method call 1";
		log.info(str);
	}//method
};

-3. 구현 클래스에서 구현객체 생성

MyFunctionalInterface fi = new MyFunctionalInterfaceImpl();

람다식의 생략조건

- 생략조건 1. 람다식의 중괄호 블록 안에서 수행할 문장이 오직 1개만 있으면, 중괄호 {} 기호 생략 가능!!

fi = () -> log.info("method call 2"); 

// 문자열 리터럴 값을 바로 대입 
// 수행 문장이 1줄 뿐이라 중괄호 기호 생략

- 생략조건 2. 매개변수 선언부의, 각 매개변수의 타입은, 컴파일러의 타입추론 기능에 의해 생략가능하다!!

//추상메서드의 매개변수 int x 의 매개변수타입 int를 생략
fi = (x) -> {  
	int result = x * 5;
	log.info(result);
};

- 생략조건 3. - 매개변수 선언부의 매개변수가 오직 1개이면 () 기호 생략 가능!!

  • 단, 매개변수가 0개 즉, 매개변수가 없다면 생략 불가!
fi = x -> log.info(x * 5);    
  • 생략조건 1+2+3 모두 적용
    - 생략조건 1. - {} 블록안에 실행문장이 오직 1개이면 ---> {} 기호 생략
    - 생략조건 2. - 매개변수 선언부의, 각 매개변수의 타입을 생략 가능.
    - 생략조건 3. - 매개변수 선언부의 매개변수가 오직 1개이면 ---> () 기호 생략 가능!!
fi = x -> log.info(x * 5);

- 생략조건 4. - 구현할 추상메소드가 리턴타입이 있고, 람다식의 실행문장이 오직 1개이고, 그 실행문장이 값을 반환하는 return 문장이라면 --> return 키워드 조차 생략 !!


  • 생략조건4. 적용 전
fi = (x, y) -> {
	int result = x + y;
	return result;
}; 
  • 생략조건4. 적용 후
fi = (x, y) -> x + y;

- [매개변수] 가 있는 타겟 타입의 추상메소드를 람다식으로 구현 방법

fi = (x) -> {
			int result = x * 5;
			log.info(result);
		};

- [매개변수] 및 [리턴타입]이 있는 타겟 타입의 추상메소드를 람다식으로 구현 방법

fi = (x, y) -> {
			int result = x + y;
			return result;
		}; 

- 람다식의 실행블록에서 얼마든지, 라이브리를 사용 가능!

  • 실행 클래스 내 정적메소드로 선언한 메소드를 람다식에서 사용 가능
// 정적 메소드 sum 생성
public static int sum(int x, int y) {
	return (x + y);
}//sum
  • 실행블록에서 라이브러리를 사용
    // 생성한 sum 메소드를 람다식에 적용 
    fi = (x, y) -> sum(x, y);



 

0개의 댓글