- 람다(Lambda)
람다 예제 : jdk8 이후 버전에 사용 가능함
람다에서 사용되는 인터페이스는 FunctionalInterface 여야함.
FunctionalInterface : 추상메서드가 한개만 존재하는 인터페이스.
매개변수,리턴타입이 없는 경우
() -> {...}; 구현.
람다식 내부에 구현되는 문장이 한개인 경우는 {} 생략 가능.
📌
package chap10;
@FunctionalInterface //어노테이션. 반드시 써야할 필요는 없다.
interface LambdaInterface1 {
void method();
}
public class LambdaEx1 {
public static void main(String[] args) {
int num = 100;
//이름없는 내부클래스
LambdaInterface1 fi = new LambdaInterface1() {
@Override
public void method() {
// num =200; //Local variable num defined in an enclosing scope must be final or effectively final 오류
System.out.println("기존방식으로 코딩:num="+num);
}
};
fi.method();
//람다 방식 코팅
fi = () -> {System.out.println("람다방식으로 코팅1:num="+num);
}; //실제 그때그때 내용을 변경 할 수 있음
fi.method();
fi = () -> System.out.println("람다방식으로 코팅1:num="+num); // 중가로 생략 할 수도 있다.
fi.method();
}
}
- 람다(Lambda) - 매개변수로 사용하기
📌
package chap10;
public class LambdaEx2 {
public static void main(String[] args) {
LambdaInterface1 f = ()-> System.out.println("람다 방식 코딩 1");
execute(f);
execute(()-> System.out.println("람다 방식 코딩 2"));
System.out.println("======================");
//1부터 100까지의 합 출력하기
f = () -> {
int sum=0;
for(int i=1;i<=100;i++) sum += i;
System.out.println("람다 방식 코딩 1");
System.out.println("1부터 100까지의 합:"+sum);
};
execute(f);
execute(()->{
int sum=0;
for(int i=1;i<=100;i++) sum += i;
System.out.println("람다 방식 코딩 2");
System.out.println("1부터 100까지의 합:"+sum);
});
}
static void execute(LambdaInterface1 f) {
f.method();
}
}
- 람다(Lambda) - 매개변수가 있는 메서드
매개변수가 있는 메서드
(매개변수명,매개변수명)-> { }
매개변수 명이 한개인 경우 () 생략 가능
📌
package chap10;
interface LambdaInterface3 {
void method(double d);
}
public class LambdaEx3 {
public static void main(String[] args) {
LambdaInterface3 f = new LambdaInterface3() {
@Override
public void method(double d) {
System.out.println(d*5);
}
};
f.method(10); //50.0
f = (x)->System.out.println(x*10);
f.method(10); //100.0
calc(f,10); //100.0
calc(f,20); //200.0
//입력값의 제곱값 출력하기
calc((x)->System.out.println(x*x),100); //10000.0
calc((x)->System.out.println(x+x),100); //200.0
}
static void calc(LambdaInterface3 f,double x) {
f.method(x);
}
}
- 람다(Lambda) - 매개변수, 리턴값이 있는경우
매개변수, 리턴값이 있는 경우
(매개변수, 매개변수) -> {return 리턴값};
리턴값 : 추상메서드의 리턴타입인 값
구현 가능 문장이 return 값인 경우는 return 구문을 생략가능
📌
package chap10;
interface LambdaInterface4 {
int method(int x, int y);
}
public class LambdaEx4 {
public static void main(String[] args) {
LambdaInterface4 f = (x,y)-> {
return x+y;
};
System.out.println(f.method(10, 20));
f = (x,y)->x+y;
System.out.println(calc(f,10,20));
System.out.println("두수의 곱:"+calc((x,y)->x*y,10,20));
System.out.println("두수의 차:"+calc((x,y)->x-y,10,20));
System.out.println("두수의 몫:"+calc((x,y)->x/y,100,20));
System.out.println("두수의 나머지:"+calc((x,y)->x%y,10,20));
System.out.println("두수 중 큰수:"+calc((x,y)->(x>y)?x:y,10,20));
System.out.println("두수 중 작은수:"+calc((x,y)->(x<y)?x:y,10,20));
//LambdaInterface4를 이용하여 배열 중 최소/최대 값을 구해주는 함수 calc 함수
int [] arr = {1,21,3,45,5,0,7,8,91,10};
System.out.println("arr배열 중 최대값:"+calc(arr,(x,y)->(x>y)?x:y));
System.out.println("arr배열 중 최소값:"+calc(arr,(x,y)->(x<y)?x:y));
}
static int calc(LambdaInterface4 f,int x,int y) {
return f.method(x, y);
}
static int calc(int [] arr,LambdaInterface4 f) {
//(x,y)->(x>y)?x:y
int result = arr[0]; //1
for(int i : arr) result = f.method(result, i);
return result;
}
}
- 람다(Lambda) - 지역변수 사용 시 주의
함수 객체에서 지역변수 사용시 지역변수는 상수화 되어야 한다.
📌
package chap10;
class Outer4 {
public int iv=10;
void method() {
int iv=20;
//오류: iv++;// why? 지역내부 클래스안의 메서드이기 때문에
LambdaInterface1 f =()-> {
System.out.println("iv="+iv);
System.out.println("this.iv="+this.iv); //외부 클래스에 있는 멤버에 접근가능
System.out.println("Outer4.this.iv="+Outer4.this.iv);//외부클래스의 멤버
};
f.method();
}
}
public class LambdaEx5 {
public static void main(String[] args) {
new Outer4().method();
}
}
'수업(국비지원) > Java' 카테고리의 다른 글
| [Java] chap11 : 기본 API (패키지 클래스) - Object 클래스, hashCode(), toString() (0) | 2023.04.16 |
|---|---|
| [Java] chap10 : 내부 클래스 - 람다 Exam 1-2 (0) | 2023.04.16 |
| [Java] chap10 : 내부 클래스 - 내부 클래스 (0) | 2023.04.16 |
| [Java] chap9: 예외처리 - Exception Exam 1-3 (0) | 2023.04.16 |
| [Java] chap9 : 예외처리 - Exception6(오버라이딩에서 예외처리), Exception7(예외클래스 생성) (0) | 2023.04.16 |