武裝
[Java] 람다식 본문
1. 람다식
-익명구현객체
-추상메서드를 하나만 가지는 인터페이스
Thread thread = new Thread(() -> {
System.out.println("run 메소드 재정의 ");
});
화살표로 표현하며, 끝날 때는 (;) 으로 마무리 필요.
package ch16;
@FunctionalInterface
public interface Calculable {
void calculate (int x, int y);
}
package ch16;
public class LambdaExample {
public static void main(String[] args) {
action((x,y) -> {
int result = x + y;
System.out.println(" resule : "+ result);
});
action((x,y) -> {
int result = x - y;
System.out.println(" resule : "+ result);
});
}
private static void action(Calculable calculable) {
int x = 10;
int y = 4;
calculable.calculate(x, y);
}
}
매개변수가 없는 람다식
함수형 인터페이스의 추상 메소드에 매개변수가 없을 경우 람다식은 아래와 같이 작성한다.
() -> {
실행문;
실행문;
}
실행문이 하나일 경우에는 중괄호를 생략할 수 있다.
() -> 실행문
package ch16;
public class Button {
// 함수형 인터페이스
@FunctionalInterface
public static interface ClickListner{
void onClick();
}
//필드
private ClickListner clickListner;
//메소드
public void setClickListner(ClickListner clickListner) {
this.clickListner = clickListner;
}
public void click() {
this.clickListner.onClick();
}
}
package ch16;
public class ButtonEvxample {
public static void main(String[] args) {
Button btnOk = new Button();
btnOk.setClickListner(() -> {
System.out.println(" 버튼을 클릭하였습니다. ");
});
btnOk.click();
Button btnCancel = new Button();
btnCancel.setClickListner(() ->System.out.println(" 취소 버튼을 클릭했습니다. "));
btnCancel.click();
}
}
매개변수가 있는 람다식
- 매개 변수가 하나인 경우, 괄호 생략은 가능할 수 있다, 이때는 타입 또는 var을 붙일 수 없다.
package ch16;
@FunctionalInterface
public interface Workable {
void work(String name, String job);
}
package ch16;
@FunctionalInterface
public interface Speakable {
void speak(String content);
}
package ch16;
public class Person {
public void action1(Workable workable) {
workable.work("홍길동", "프로그래밍");
}
public void action2 (Speakable speakable) {
speakable.speak("안녕하세요");
}
}
package ch16;
public class LambdaExample703 {
public static void main(String[] args) {
Person person = new Person();
person.action1((name, job) -> {
System.out.print(name + "이");
System.out.println(job + "을 합니다.");
});
person.action1((name, job) -> System.out.println(name+"이 " + job + "을 합니다."));
person.action2(word -> {
System.out.print("\"" + word + "\"");
System.out.println("라고 말합니다.");
});
person.action2(word -> System.out.println("\"" + word + "\"" + "라고 말합니다. 2"));
}
}
리턴값이 있는 람다식
함수형 인터페이스의 추상 메소드에 리턴값이 있을 경우 람다식은 아래와 같이 작성한다.
(매개변수, ...) -> {
실행문;
return 값;
}
return문이 하나만 있을 경우에는 return키워드와 중괄호를 생략할 수 있다.
(매개변수, ...) -> 값;
package ch16.sec04;
@FunctionalInterface
public interface Calculable {
double cal(double x, double y);
}
package ch16.sec04;
public class Person {
public void action(Calculable calculable) {
double result = calculable.cal(10, 4);
System.out.println(" 결과 : " + result);
}
}
package ch16.sec04;
public class LambdaExample {
public static void main(String[] args) {
Person person = new Person();
//실행문이 두 개 이상일 경우
person.action((x,y) -> {
double result = x + y;
return result;
});
// 리턴문이 하나만 있을 경우(연산식)
person.action((x,y) -> (x+y));
// 리턴문이 하나만 있을 경우(메소드 호출)
person.action((x,y) -> sum(x,y));
}
public static double sum(double x, double y) {
return (x + y);
}
}
메소드 참조
메소드를 참조해서 매개변수의 정보 및 리턴 타입을 알아내,
람다식에서 불필요한 매개변수를 제거하는 것을 목적으로 한다.
- 정적 메소드를 참조 = 클래스 이름 뒤에 ::기호를 붙이고 정적 메소드 이름을 기술.
클래스 :: 메소드
- 인스턴스 메소드 참조 = 먼저 객체를 생성한 다음 참조 변수 뒤에 ::기호를 붙이고 인스턴스 메소드 이름을 기술.
참조변수 :: 메소드
-매개변수 메소드 참조
(a, b) -> {a.instanceMethod(b)};
클래스 :: instanceMethod
package ch16.sec04;
public class Computer {
public static double staticMethod(double x, double y) {
return x + y;
}
public double instanceMethod(double x, double y) {
return x * y;
}
}
package ch16.sec04;
public class MethodReferenceExample {
public static void main(String[] args) {
Person person = new Person();
// 정적메소드의 경우
// person.action((x,y) -> Computer.staticMethod(x,y));
person.action(Computer :: staticMethod);
//인스턴스 메소드의 경우 재정의 필요
Computer com = new Computer();
//person.action((x,y) -> com.instanceMethod(x,y));
person.action(com :: instanceMethod);
}
}
매개변수 메소드 참조
package ch16.sec04;
@FunctionalInterface
public interface Comparable {
int compare (String a, String b);
}
package ch16.sec04;
public class Person02 {
public void ordering(Comparable comparable) {
String a = "홍길동";
String b = "김길동";
int result = comparable.compare(a,b);
if (result < 0) {
System.out.println(a + "은" + b + "보다 앞에 옵니다.");
} else if (result == 0) {
System.out.println(a + "은" + b + "과 같습니다.");
} else {
System.out.println(a + "은" + b + "보다 뒤에 옵니다.");
}
}
}
package ch16.sec04;
public class MethodReference {
public static void main(String[] args) {
Person02 person = new Person02();
person.ordering(String :: compareToIgnoreCase);
}
}
'프로그래머로 레벨업! > Java' 카테고리의 다른 글
[Java] 입출력 스트림 1 (2) | 2024.03.27 |
---|---|
[Java] 스트림 요소 처리 (0) | 2024.03.26 |
[Java] 컬렉션 자료 구조 2 (0) | 2024.03.25 |
[Java] 컬렉션 자료 구조 1 (1) | 2024.03.22 |
[Java] 멀티 스레드 2 (2) | 2024.03.22 |