람다식

Java

목록 보기
20/26
post-thumbnail

1. 람다식

함수(메서드)를 간단한 식(expression)'으로 표현하는 방법

int max(int a, int b) {
	return a>b ? a : b ;
}
(a,b) -> a > b ? a : b
  • 이름 없는 함수. 메서드에서 이름을 지운다.

    함수와 메서드 차이: 근본적으로 동일. 함수는 일반적 용어, 메서드는 객체지향언어

1-1. 람다식 작성하기

  • 메서드의 이름과 반환타입을 제거하고 ->를 블록{}앞에 추가한다.
  • 반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능(끝에 ; 안 붙임)

1-2. 주의사항

  • 매개변수가 하나인 경우, 괄호() 생략 가능(타입이 없을 때만)
  • 블록 안의 문장이 하나뿐 일때, 괄호{} 생략가능(끝에 ;안 붙임)

    1-3. 람다식은 익명 함수? 익명 객체!

  • 람다식은 익명 함수가 아니라 익명 객체이다.
  • 람다식(익명객체)을 다루기 위한 참조변수가 필요. 참조변수의 타입은?

2. 함수형 인터페이스

  • 함수형 인터페이스 - 단 하나의 추상 메서드만 선언된 인터페이스
@FunctionalInterface 			//안 붙여도 되는데, 
함수형 인터페이스는 단 하나의 추상 메서드만 가져야하니까 여기에 두개 메서드를 선언했을 때 에러가 나면서 잡아 줌
interface MyFunction {
	public abstarct int max(int a, int b);
}
//public abstrat은 안 붙여도 됨. 인터페이스는 항상 public abstrat이니까.
MyFunction f = new MyFunction() {
	public abstrat int max(int a, int b) {
    	return a > b ? a : b;
    }
}
int value = f.max(3,5);

*오버라이딩 규칙 : 접근제한자는 더 좁게 못 바꾼다.

  • 함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있음.
Myfunction f = (a,b) -> a>b ? a: b;
int value = f.(3,5);

2-1. 함수형 인터페이스 example

2-1-1. 익명 객체를 람다식으로 대체

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

Collection.sort(list, new Comparator<String>() {
			public int compare(String s1, String s2) {
            		return s2.compareTo(s1);
                    }
                    });


interface Comparator<T> {
	int compare(T o1, T o2);
}

List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collection.sort(list,(s1, s2) -> s2.compareTo(s1));

2-1. 함수형 인터페이스 타입의 매개변수, 반환타입

  • 함수형 인터페이스 타입의 매개변수
interface MyFuntion {
	void myMethod();
}
void aMethod(MyFuntion f) {
	f.myMethod();			//MyFuntion에 정의된 메서드 호출
}

람다식에 myMethod라는 이름을 붙여준 셈

MyFuntion f = () -> System.out.println("myMethod()");
a.Method(f);

aMethod(() -> System.out.println("myMEethod()"));
  • 함수형 인터페이스 타입의 반환타입

와~~ 진짜 모르겠다 이거~~

2-2. java.util.function 패키지



매개변수 세 개여야하면? -> 직접 만들면 됨

2-3. predicate의 결합

  • and() or() negate()로 두 predicate를 하나로 결합.
    negate()는 not(!)

  • 연습문제:람다식을 두개로 연결할 수 있다는것만 알고 넘어가시면 될거같아요. 깊게 파지마시고요.

2-4. 컬렉션 프레임웍과 함수형 인터페이스

2-5. 메서드 참조

  • 람다식을 더 같단히 한 것
  • 하나의 메서드만 호출하는 람다식은 메서드 참조로 간단히 할 수 있다.
  • 사용 방법 : 클래스이름::메서드이름

    여러분 람다식은 잘하는데 메서드 참조를 못하시더라고요
    메서드참조를 람다식으로 바꾸는 연습을 계속 해보세요.

2-6. 생성자의 메서드 참조

  • 생성자와 메서드 참조
Supplier<Myclass> s = () -> new Myclass();

생성만. 주기만 함. 입력없고 출력있음.
위 예시는 Myclass 타입의 객체만 주는 것.

어우 씨 몰라 이건 책 봐

0개의 댓글