개발하는 삶
[Java] 람다식 본문
람다식
- 자바에 함수형 언어를 넣은거
- 함수(메서드)를 간단한 식으로 표현한 방법
- 함수와 메서드의 차이
- 근본적으로 동일하지만 함수는 클래스 밖에 있고, 메서드는 클래스 내에 있는것
- 익명함수가 아니라 익명객체 라고 함
- 객체의 선언과 생성을 동시에 해서
- 익명객체를 다루기위한 참조변수가 필요할 때 : 함수형 인터페이스를 사용함
- 람다식 작성하기
- 메서드의 이름, 반환타입(int 등) 제거 후 매개변수 + -> + {} 으로 완성
- return문 생략. 끝에 ; 안붙임
- 매개변수의 타입은 추론 가능시 생략 가능(int a 같은거 int 지워도 됨)
- 매개변수가 하나이면 괄호 생략 가능(타입 없을때만)
- (a) -> a*a //를 a -> a*a //로 바꿀 수 있으나
- (int a) -> a*a //를 int a -> a*a //로 바꿀 수 없다
- 블록 안의 문장이 하나뿐일 때, {} 생략 가능 (;는 안붙임)
- (int i) -> {...;}
- (int i) -> ...
- 로 변경 가능
int max(int a, int b){
return a>b? a:b;
}
//를,
(a, b) -> a>b? a:b
//로 바꾼것
함수형 인터페이스
- 단 하나의 추상메서드만 선언된 인터페이스
- new 조상클래스/인터페이스 () {...};
//익명 클래스로 함수형 인터페이스 만들기
//이미 있는 MyFunction 인터페이스를 상속해서 만드는것
MyFunction f = new Myfunction() {
//메서드
};
- 함수형 인터페이스 타입의 참조변수로 람다식을 참조할 수 있음
My Function f = (a,b) -> a>b? a:b; //이름(참조변수)를 지어줌
int value = f.max(3,5) //람다식이 호출됨
java.util.function 패키지
- 자주 사용되는 다양한 함수형 인터페이스를 제공
- Supplier<Integer> 등
- 매개변수가 2개인 함수형 인터페이스
- 매개변수의 타입과 반환타입이 일치하는 함수형 인터페이스
람다식 합성 - Function
- andThen() : Function 타입의 두 람다식을 하나로 합성
- compose() : 위와같다. 실행순서만 살짝 다르다
//람다식 f와 g가 있을때 둘을 합성함
//f의 출력 = g의 입력 이어야 실행 가능! (둘을 합성하는거기 때문에)
//andThen은 f에 g를 합성
//compose는 g에 f를 합성
Function<String, String> h = f.andThen(g);
Function<String, String> h = f.compose(g);
람다식 합성 - Predicate
- and(), or(), negate()로 두 Predicate를 하나로 결합(default 메서드)
- 결과값은 boolean 으로 true/false 반환
//선언
Predicate<Integer> p = i -> i<100;
Predicate<Integer> q = i -> i<200;
Predicate<Integer> r = i -> i%2==0;
//negate() : !, not 등의 반대의 값을 내놓는다
//and() : 포함
//or() : 이거나
Predicate<Integer> notp = p.negate();
Predicate<Integer> all = notp.and(q).or(r);
Predicate<Integer> all2 = notp.and(q.or(r)); //notp&&(q||r)
- 등가 비교를 위한 Predicate는 isEqual()을 사용
Predicate<String> p = Predicate.isEqual(str1); //isEqual()는 static 메서드
Boolean result = p.test(str2); //str1과 str2가 같은지 비교한 결과를 반환
//위를 합치면
boolean result = Predicate.isEqual(str1).test(str2);
컬렉션 프레임웍과 함수형 인터페이스
- 함수형 인터페이스를 사용하는 컬렉션 프레임웍의 메서드
람다식을 메서드 참조하기
- 하나의 메서드만 참조하는 람다식은 [참조변수::메서드이름] 으로 간단히 할 수 있음
- 클래스이름 :: 메서드 이름
//이 메서드를
Integer method (String s) {
return Integer.parseInt(s);
}
//람다식+메서드 해서 간단히 표현 가능
Function<String, Integer> f = (String s) -> Integer.parseInt(s);
//메서드 참조 - 위를 더 간단히 표시하기!(최종)
Function<String, Integer> f = Integer::parseInt;
생성자의 메서드 참조
- 메서드가 없으니 new를 대신 넣으면 됨
- 클래스/배열::new
Supplier<MyClass> s = () -> new MyClass();
Supplier<MyClass> s = () -> MyClass::new;
//매개변수 있는 경우. 클래스가 출력하는 것
Function<Integer, MyClass> s = (i) -> new MyClass(i);
Function<Integer, MyClass> s = MyClass::new;
//배열과 메서드 참조. 배열은 무조건 Function으로 해야함!
Function<Integer, int[]> f = x -> new int[x] //람다식
Function<Integer, int[]> f = int[]::new; //메서드 참조
'Java' 카테고리의 다른 글
[Java] Stack, Queue, Collection (0) | 2022.07.12 |
---|---|
[Java] Stream (0) | 2022.06.27 |
[Java] 제네릭스 (0) | 2022.06.25 |
[Java] 예외, 래퍼 클래스 (0) | 2022.06.25 |
[Java] 스레드 (0) | 2022.06.21 |