본문으로 바로가기

Java - 람다

category 프로그래밍 언어/Java 2019. 7. 28. 18:21

1. 람다식

람다식은 하나의 식으로 메서드를 표현한 것입니다.

간단해서 익명함수라고 불립니다.

int[] arr = new int[5];

// 람다식                    
Arrays.setAll(arr, () -> (int)(Math.random()*5)+1);

람다식을 작성하는 방법은 우선 메소드 반환 타입과 메소드 이름을 제거해줍니다.

그리고 매개변수 (Argument arg) 와 body 부분 {}사이에 ->를 추가합니다.

즉 

// 메서드
ReturnType methodName(Argument argument) {
  //...
}

// 람다식 : 반환타입과 메서드명을 없애고, 매개변수와 {} 사이에 ->를 추가
(Argument argument) -> {
  //...
}
int max(int a, int b){
	return a>b ? a: b;
}

위 일반 메서드가 있으면 이를 람다식으로 변형해봅시다.

(int a,int b) -> {return a>b ? a:b;}
(int a,int b) -> a>b ? a:b // ;은 없애자.
(a,b) -> a>b ? a: b
//매개변수 하나일 경우 괄호 생략 가능 단 타입 생략
(int a) -> a*a
a -> a*a
int a -> a*a //에러 발생

2. 예제

int sumArr(int[] arr) {
  int sum = 0;
  for(int i : arr)
      sum += i;
  return sum;
}

(int[] arr) -> {
  int sum = 0;
  for(int i : arr)
      sum += i;
  return sum;
}

3. 함수형 인터페이스(@FunctionalInterface)

@FunctionalInterface
interface MyFunction { // 함수형 인터페이스 MyFunction을 정의
  public abstract max(int a, int b);
}

인터페이스를 통해서 람다식을 이룰 수 있습니다. 이를 함수형 인터페이스라고 불립니다.

대신 오직 하나의 추상메서드만 가질 수 있씁니다.

 

List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");

Collections.sort(list, new Comparator<String>()) {
  public int compare(String s1, String s2) {
    return s2.compareTo(s1);
  }
}
List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");

// 람다식으로 처리
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));

위 처럼 간단하게 바꿀 수 있습니다.

 

위 함수형인터페이스 MyFunction이 정의되어 있으므로 이를 매개변수로 참조하는 메서드를 살펴봅시다.

@FunctionalInterface
interface MyFunction {  // 함수형 인터페이스
  void myMethod(); // 추상메서드
}

void aMethod(MyFunction f) { //함수형인터페이스가 매개변수
  f.myMethod(); //함수형 인터페이스의 메서드를 호출
}
//참조할 Myfunction 함수형 인터페이스 정의
MyFunction f = () -> System.out.println("myMethod()");
aMethod(f);

 

'프로그래밍 언어 > Java' 카테고리의 다른 글

디자인 패턴- Template Method Pattern  (0) 2019.08.21
자바 공부(취업 준비)  (0) 2019.07.29
Java- 열거형  (0) 2019.07.26
Java - 제네릭  (0) 2019.07.25
Java- 컬렉션 프레임워크(Collections)  (0) 2019.07.24