개발하는 삶

[Java] 람다식 본문

Java

[Java] 람다식

삶_ 2022. 6. 26. 10:24

 

람다식

  • 자바에 함수형 언어를 넣은거
  • 함수(메서드)를 간단한 식으로 표현한 방법
  • 함수와 메서드의 차이
    • 근본적으로 동일하지만 함수는 클래스 밖에 있고, 메서드는 클래스 내에 있는것
  • 익명함수가 아니라 익명객체 라고 함
    • 객체의 선언과 생성을 동시에 해서
    • 익명객체를 다루기위한 참조변수가 필요할 때 : 함수형 인터페이스를 사용함
  • 람다식 작성하기
    • 메서드의 이름, 반환타입(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