@FunctionalInterface
public interface MyFunctionalInterface {
//람다식의 구현대상
public abstract void method();
}//end interface
class OutterClass {
int outterField = 10;
class InnerClass{
int innerField = 20;
}
}
- 바깥쪽클래스의 필드 및 메소드를 호출할때...
바깥쪽클래스.this.outterField
바깥쪽클래스.this.메소드()
- 안쪽클래스의 필드 및 메소드를 호출할때...
this.innerField
this.메소드()
- 생명주기가 짧은 지역변수를 생명주기가 긴 익명구현객체 내부에서 사용할 때 발생하는 현상
람다식 블록에서, 블록 바깥의 지역변수를 사용하게 되면 클로저(Closure) 문제가 발생한다.
따라서 람다식에서 블록 바깥의 지역변수를 사용하게 되면
내부에서 필요로하는 정보를 넘길때 값이 변경되면 의도하지 않은 결과가 나올 수 있기 때문에, 컴파일러가 생명주기가 짧은 지역변수를 final 상수로 처리해서 값을 계속사용가능하게 만들어준다.
--- 하지만 final로 처리되었기 때문에 값의 수정이 불가능하다.
- var 타입은 대입되는 값의 유형(형태)에 따라 타입이 결정된다
var value1 = 10; // 이때 var의 타입은 'int'타입으로 결정 var value2 = "hello"; // 이때 var의 타입은 'String'타입으로 결정
- 아래 코드에서는 오류가 발생한다.
//value에 정수 40이 들어오기 때문에 var 타입은 '정수'타입으로 결정 var value = 40; //이 후, 변수 value에 문자열을 대입해보면 이미 '정수'타입으로 결정이 되었기 때문에 //정수 타입 변수 value에 문자열이 대입될 수 없다. value = "hello";
- 객체 T를 받아 소비
Consumer<String> consumer = t -> log.info(t + "8"); consumer.accept("java");
- 객체 T와 U를 받아 소비
BiConsumer<String, String> bigConsumer = (t, u) -> log.info(t + u); bigConsumer.accept("java", "8");
- double 값을 받아 소비
DoubleConsumer doubleConsumer = d -> log.info("java" + d); doubleConsumer.accept(8.0);
- 객체 T와 int 값을 받아 소비
ObjIntConsumer<String> objIntConsumer = (t, i) -> log.info(t + i); objIntConsumer.accept("JAVA", 8);