본 게시물은 스스로의 공부를 위한 글입니다.
틀린 내용이 있을 수 있습니다.
y=f(x)
형태의 함수로 구성된 프로그래밍 기법람다식을 언어 차원에서 제공해준다.
(타입 매개변수, ...) -> {실행문; ...}
장점: 코드가 매우 간결해진다. 컬렉션 요소를 필터링 또는 매핑해서 쉽게 집계할 수 있다.
자바는 람다식을 함수적 인터페이스의 익명 구현 객체로 취급한다.
함수적 인터페이스란 한개의 메소드를 가지고 있는 인터페이스이다.
Runnable runnable = new Runnable(){
public void run(..) {...}
};
Runnable runnable = (..)->{...}; //람다식 변환!
(타입 매개변수, ...) -> {실행문; ... }
(int a) -> {System.out.println(a);};
(a)->{System.out.println(a);};
a->{System.out.println(a);};
a-> System.out.println(a)
()->{실행문;...};
(x, y)-> {return x+y;};
(x, y) -> x+y
인터페이스 변수=람다식;
하나의 추상 메소드만 가지는지 컴파일러가 체크하도록 한다.
두 개 이상의 추상 메소드가 선언되어 있으면 컴파일 오류 발생
함수적 인터페이스 선언
@FunctionalInterface
public interface MyFunctional{
public void method();
}
람다식으로 익명 구현 객체 구현
MyFunctional fi=()->{...}
사용하는 법
fi.method();
Function<T, S>
apply
를 구현하면 된다.Function<Integer, Integer> plus10=(i)->i+10;
System.out.println(plus10.apply(1));
compose
: F1.compose(F2);andThen
: F1.andThen(F2);Function<Integer, Integer> plus10=(i)->i+10;
Function<Integer, Integer> multiply2=(i)->i*2;
Function<Integer, Integer> multiply2AndPlus10=plus10.compose(multiply2));
Function<Integer, Integer> plus10AndMultiply2=plus10.andThen(multiply2));
System.out.println(multiply2AndPlus10(2));
BiFunction<T, U, R>
R apply(T t, U u)
Consumer<T>
void Accept(T t)
andThen
Supplier<T>
T get()
Predicate<T>
boolean test(T t)
UnaryOperator<T>
Function<T, R>
의 특수한 형태로, 입력값 하나를 받아서 동일한 타입을 리턴하는 함수 인터페이스BinaryOperator<T>
BiFunction<T, U, R>
의 특수한 형태로, 동일한 타입의 입렵값 두개를 받아 리턴하는 함수 인터페이스final이거나 effective final 인 경우에만 참조할 수 있다.
그렇지 않을 경우 concurrency 문제가 생길 수 있어서 컴파일가 방지한다.
자바 8부터 지원하는 기능으로 “사실상" final인 변수.
final 키워드 사용하지 않은 변수를 익명 클래스 구현체 또는 람다에서 참조할 수 있다.
익명 클래스 구현체와 달리 ‘쉐도윙’하지 않는다.
public class local{
void method(int arg){
int localVar=40;
MyFunctional fi=()->{
//arg=31; //final이므로 수정 불가
//localVar=41; //final이므로 수정 불가
System.out.println(arg, localVar);
}
}
}
private void run() {
int num=10;
IntConsumer printlnt=(i)->{
System.out.println(num+i); //여기의 num 위에서 선언헌 num과 같은 변수이다.
};
//num++; //람다에서 이 변수를 사용중 -> effective final -> 변경할 수 없다.
}