본문 바로가기
JAVA

221028 Lambda

**Lambda(람다)
1.개요
=>jdk 1.7부터 함수형 프로그래밍을 위해서 추가
=>이름없는 함수를 만들기 위해서 사용
=>익명 객체를 만들어서 사용하던 것을 조금 더 간결하게 함수를 대입하는 형태처럼 보이도록 하기 위해서 사용
=>단, 메서드가 1개만 존재하는 인터페이스에서만 사용이 가능

2.작성 방법
(매개변수 나열)->{내용을 작성}

=>매개변수를 작성할 때는 자료형과 매개변수 이름을 작성하는데 매개변수 자료형은 생략이 가능합니다.
자료형을 생략하면 호출할 때 자료형을 결정합니다.
=>매개변수가 1개인 경우는 ()를 생략하는 것이 가능
매개변수가 없거나 2개 이상인 경우는 생략하면 안됨

3.실습
=>메서드에 return type이 있다면 return을 만들면 됨.
이때 중괄호 안에 return하는 문장만 있다면 {}를 생략하는 것이 가능함
그럴 경우 return도 생략! 하나만 지우는 건 안되고 둘 다 지워야 함.

Arrays.sort(str, new Comparator<String>() {
  @Override
  public int compare(String o1, String o2) {
  return o2.compareTo(o1);
}});

이 식이
Arrays.sort(str,(o1,o2)->o2.compareTo(o1));
이렇게. 간단해진다.

단, 코드의 가독성이 떨어진다는 단점이 있긴 함.
인텔리제이는 코드 최적화 기능이 있어서 람다식으로 바꿔버린다. 

 

 

Lambda

package java_1028.Lambda;

import java.util.Arrays;
import java.util.Comparator;

public class LambdaMain {
	public static void main(String[] args) {
		//배열의 정렬
		String[] str = {"아담", "이브", "카인", "골리앗", "야훼"};

		//배열의 내림차순 정렬
		//Arrays.sort(배열, 비교를 위한 Comparator<T> 인터페이스를 구현한 클래스의 객체)를 호출해야 함
		Arrays.sort(str, new Comparator<String>() {//sort는 한번만 쓸 거니까 Anonymous 사용
			@Override
			public int compare(String o1, String o2) {
				return o2.compareTo(o1);
			}});

		//Lambda
		//Comparator는 메서드가 1개만 존재합니다.->이것이 람다를 위한 전제 조건. 메서드는 1개만 있어야 함
		//람다를 만들 때는 인터페이스 이름과 메서드 이름은 중요하지 않음.
		//중요한 건 매개변수의 개수와 리턴타입만 확인하면 됨
		//매개변수는 2개이고 리턴타입은 정수
		//매개변수가 1개이면 ()생략도 가능
		Arrays.sort(str,(o1,o2)->{return o2.compareTo(o2);});
		//{}안에 return하는 문장만 존재하면 둘 다 생략 가능
		Arrays.sort(str,(o1,o2)->o2.compareTo(o1));
		//메서드의 매개변수로 코드(함수)를 대입한 것처럼 보이도록 함
		//메서드의 매개변수로 코드(함수)를 대입할 수 있는 방식을 "함수형 프로그래밍"이라고 함-자바는 함수형 프로그래밍을 지원하지 않음. 그렇게 보이도록 한 것일 뿐. 
		

		//배열의 요소를 빠르게 확인
		System.out.println(Arrays.toString(str));
	}
}
[카인, 이브, 야훼, 아담, 골리앗]




4.자바가 제공하는 람다 인터페이스

1)★Comsumer : 매개변수는 있고 리턴 값은 없는 메서드를 소유한 인터페이스-System.out.prinln();

2)Supplier : 매개변수는 없고 리턴값만 있는 메서드를 소유한 인터페이스

3)★Function : 매개변수와 리턴이 모두 있는 메서드를 소유한 인터페이스 -이런 모양은 대부분 변환 작업이 있을 때 사용

4)★Operator : 매개변수가 있고 리턴도 있는 메서드를 소유한 인터페이스 -이 인터페이스는 일반적으로 메서드 내부에서 연산 작업 수행

5)★Perdicate : 매개변수가 있고 리턴 값이 boolean인 메서드를 소유한 인터페이스 -판정. 필터링 할 때

'JAVA' 카테고리의 다른 글

221028 Thread  (0) 2022.10.28
221028 Stream API  (0) 2022.10.28
221028 Anonymous Class  (0) 2022.10.28
221028 Nested Class(내포 클래스)-(Embedding)  (0) 2022.10.28
221027 Serializable, DTO  (0) 2022.10.27