Jeonguk Lee

I am java developer.

Lambda expressions in java

20 Jan 2018 » java, language

Lambda expressions in java

  • 람다 식은 Stream API의 데이터에서 파이프 라인 연산을 지원하는 것처럼 멀티 코어 환경의 병렬 처리 기능을 활용합니다.
  • 기능 인터페이스에 의해 정의 된 메소드를 구현하는 데 사용되는 익명 메소드 (이름없는 메소드)입니다.

Functional interface

  • Functional interface 는 오직 하나의 추상 메소드를 포함하는 인터페이스입니다.

  • 자바 표준 Runnable 인터페이스의 정의를 살펴보면 run () 메서드를 정의하기 때문에 함수 인터페이스의 정의에 어떻게 부합하는지 알 수 있습니다.

  • 아래 코드 샘플에서 computeName 메서드는 암시 적으로 추상화 된 메서드이며 정의 된 유일한 메서드이므로 MyName을 기능적 인터페이스로 만듭니다.

interface MyName{
  String computeName(String str);
}

The Arrow Operator

  • 람다 식은 새로운 화살표 연산자 인 ->를 Java에 도입합니다. 람다 식은 두 부분으로 나뉩니다.
(n) -> n*n
  • 왼쪽은 표현식에 필요한 매개 변수를 지정하며 매개 변수가 필요하지 않은 경우 비어있을 수도 있습니다.
  • 오른쪽은 람다 식의 동작을 지정하는 람다 본문입니다. 이 연산자에 대해 “될”것으로 생각하는 것이 도움이 될 수 있습니다. 예를 들어, “n은 n * n이됩니다”또는 “n은 n 제곱이됩니다”.

  • 함수형 인터페이스와 화살표 연산자 개념을 염두에두면 간단한 람다 식을 조합 할 수 있습니다.
interface NumericTest {
	boolean computeTest(int n); 
}

public static void main(String args[]) {
	NumericTest isEven = (n) -> (n % 2) == 0;
	NumericTest isNegative = (n) -> (n < 0);

	// Output: false
	System.out.println(isEven.computeTest(5));

	// Output: true
	System.out.println(isNegative.computeTest(-5));
}
  • Numeric Test
interface MyGreeting {
	String processName(String str);
}

public static void main(String args[]) {
	MyGreeting morningGreeting = (str) -> "Good Morning " + str + "!";
	MyGreeting eveningGreeting = (str) -> "Good Evening " + str + "!";
  
  	// Output: Good Morning Luis! 
	System.out.println(morningGreeting.processName("Luis"));
	
	// Output: Good Evening Jessica!
	System.out.println(eveningGreeting.processName("Jessica"));	
}
  • Greeting Lambda

  • 위의 예제에서 morningGreeting 및 eveningGreeting 변수 6 및 7은 MyGreeting 인터페이스에 대한 참조를 만들고 다른 인사말 표현식을 정의합니다.
  • 람다 식을 작성할 때 다음과 같이 식의 매개 변수 유형을 명시 적으로 지정할 수도 있습니다.
MyGreeting morningGreeting = (String str) -> "Good Morning " + str + "!";
MyGreeting eveningGreeting = (String str) -> "Good Evening " + str + "!";

Block Lambda Expressions

  • 지금까지 단일 표식 람다 샘플을 다루었습니다. 화살표 연산자의 오른쪽에있는 코드가 블록 람다 (block lambdas)라고 알려진 둘 이상의 명령문을 포함 할 때 사용되는 다른 유형의 표현식이 있습니다.
interface MyString {
	String myStringFunction(String str);
}

public static void main (String args[]) {
	// Block lambda to reverse string
	MyString reverseStr = (str) -> {
		String result = "";
		
		for(int i = str.length()-1; i >= 0; i--)
			result += str.charAt(i);
		
		return result;
	};

	// Output: omeD adbmaL
	System.out.println(reverseStr.myStringFunction("Lambda Demo")); 
}

Generic Functional Interfaces

  • 람다 식은 Generic 일 수 없습니다. 그러나 람다 표현과 관련된 Functional interface는 가능합니다. 하나의 일반적인 interface를 작성하고 다음과 같이 여러 반환 유형을 처리 할 수 ​​있습니다.
interface MyGeneric {
	T compute(T t);
}

public static void main(String args[]){

	// String version of MyGenericInteface
	MyGeneric<String> reverse = (str) -> {
		String result = "";
		
		for(int i = str.length()-1; i >= 0; i--)
			result += str.charAt(i);
		
		return result;
	};

	// Integer version of MyGeneric
	MyGeneric<Integer> factorial = (Integer i) -> {
		int result = 1;
		
		for(int i=1; i <= n; i++)
			result = i * result;
		
		return result;
	};

	// Output: omeD adbmaL
	System.out.println(reverse.compute("Lambda Demo")); 

	// Output: 120
	System.out.println(factorial.compute(5)); 

}

Lambda Expressions as arguments

  • 람다의 한 가지 일반적인 사용은 인수로 전달하는 것입니다.
  • 대상 유형을 제공하는 모든 코드에서 사용할 수 있습니다.
  • 메소드에 인수로 실행 가능한 코드를 전달할 수 있기 때문에 이 흥미로운 사실을 알게되었습니다.
  • 람다 식을 매개 변수로 전달하려면 기능 인터페이스 유형이 필수 매개 변수와 호환되는지 확인하십시오.
interface MyString {
	String myStringFunction(String str);
}

public static String reverseStr(MyString reverse, String str){
  return reverse.myStringFunction(str);
}

public static void main (String args[]) {
	// Block lambda to reverse string
	MyString reverse = (str) -> {
		String result = "";
		
		for(int i = str.length()-1; i >= 0; i--)
			result += str.charAt(i);
		
		return result;
	};

	// Output: omeD adbmaL
	System.out.println(reverseStr(reverse, "Lambda Demo")); 
}