예제에서 사용할 함수형 인터페이스
@FunctionalInterface
public interface VoidTypeNoParam {
void run();
}
@FunctionalInterface
public interface IntTypeOneParam {
int intOneParam (int value);
}
1. 람다 표현식
public class LamdaExam01 {
public static void main(String[] args) {
//익명 객체
VoidTypeNoParam anonymous = new VoidTypeNoParam() {
@Override
public void run() {
System.out.println("Hello 익명! ");
}
};
anonymous.run();
// 람다식
VoidTypeNoParam lambda = () -> {
System.out.println("Hello 람다 !");
};
lambda.run();
// 한 문장인 경우 중괄호 { }을 생략할 수 있다.
VoidTypeNoParam lambda2 = () -> System.out.println("중괄호 생략 !");
lambda2.run();
/*람다식의 타입은함수형 인터페이스와 일치하지 않는다.
따라서 형변환이 필요하고 이 형변환은 생략할 수 있다.*/
VoidTypeNoParam lambda3 = (VoidTypeNoParam) ()->System.out.println("형변환 생략 가능");
lambda3.run();
/* 람다식은 Object 타입으로 직접 형변환할 수 없다.
함수형 인터페이스로 변환 후 오브젝트타입으로 변환 가능하다. */
// Object obj = ()-> System.out.println("되나?");
Object obj1 = (Object) (VoidTypeNoParam) ()-> System.out.println("오브젝트타입으로 변환");
Object obj2 = (VoidTypeNoParam) ()-> System.out.println("형변환 생략 가능함");
System.out.println(obj1);
System.out.println(obj2);
}
}
public class LamdaExam02 {
public static void main(String[] args) {
// 익명 객체
IntTypeOneParam intTypeOneParam = new IntTypeOneParam() {
@Override
public int intOneParam(int value) {
return (int)(Math.random()*10) + value;
}
};
int anony = intTypeOneParam.intOneParam(4);
System.out.println(anony);
/* 람다식 */
// return을 명시하는 경우 한 문장이어도 중괄호를 생략할 수 없다.
IntTypeOneParam lamda1 = (int value) -> {return (int)(Math.random()*10) + value; };
int r1 = lamda1.intOneParam(10);
System.out.println(r1);
// retun을 생략할 수 있다. 이 경우 반드시 { } 생략해야함
IntTypeOneParam lamda2 = (int value) -> (int)(Math.random()*10) + value;
int r2 = lamda2.intOneParam(10);
System.out.println(r2);
// 매개변수의 타입을 추론할 수 있는 경우 이를 생략할 수 있다.
IntTypeOneParam lamda3 = (value) -> (int)(Math.random()*10) + value;
int r3 = lamda3.intOneParam(10);
System.out.println(r3);
// 매개변수가 하나인 경우 ( )를 생략할 수 있다 .
IntTypeOneParam lamda4 = value -> (int)(Math.random()*10) + value;
int r4 = lamda4.intOneParam(10);
System.out.println(r4);
}
}
2. 내부 클래스에서 람다식의 외부클래스 변수 참조
/* 내부클래스에서 람다식의 외부클래스변수 참조 */
public class Outer {
int value = 100;
public Outer(){
value = 999; //람다식에서 참조하더라도 생성자에서 값 변경 가능
}
class Inner{
int value = 10;
Inner(){ value = 99;} // 생성자에서 값 변경 가능
void innermethod(int i){ // 람다식 내에서 참조하고 있다. final int i 로 간주
int value = 1; // 람다식 내에서 참조하고 있다. final int value 로 간주
// value = 9; 에러
// i = 9999999; 에러
VoidTypeNoParam voidTypeNoParam = ()->{
System.out.println("매서드의 파라미터 i : " + i);
System.out.println("람다식이 존재하는 메서드 내 value : " + value);
System.out.println("내부 클래스 this.value : "+this.value);
System.out.println("외부 클래스 Outer.this.value : " + Outer.this.value);
};
voidTypeNoParam.run(); //람다식 실행
}
}
}
public class LamdaExam03 {
public static void
main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.innermethod(10000);
}
}
[Lambda] 함수형 인터페이스 : Runnable (0) | 2020.06.19 |
---|---|
[Lambda] 함수형인터페이스 : Predicate (0) | 2020.06.19 |
[Stream] Collect - groupingBy : 컬렉션 요소를 그룹핑해서 Map객체 얻기 (0) | 2020.06.18 |
[Stream] 스트림 : collect - Collectors - toList, toCollection, 사용자 정의 수집 (0) | 2020.06.18 |
[Stream] 스트림 커스텀 집계 reduce (0) | 2020.06.18 |
댓글 영역