728x90
반응형
lambda
먼저 lambda에 대한 설명은 여기를 참고하자.
https://wouldyou.tistory.com/63
callback만들기
functional interface를 하나 생성해준다.
interface Testable {
void run();
}
interface를 아래와 같이 구현하면 callback처럼 사용할 수 있다.
public class Example {
// 인터페이스 Testable로 된 클래스를 실행하는 함수
public static void test(Testable test) {
// run 실행
test.run();
}
// 실행 함수
public static void main(String... args) {
// 람다식, 익명 클래스의 new의 선언도 없이 바로 run 함수를 실행할 수 있는 표현식
Testable obj = () -> {
// 콘솔 출력
System.out.println("run!");
};
// test 함수 실행
test(obj); //run!
}
}
자주 사용되는 interface
interface를 위처럼 만들어도 되지만, 이미 만들어져 있는 것을 가져다 쓸 수도 있다. 주로 Callbale과 Runnable이 많이 쓰인다.
Runnable은 단순히 실행만시키고, Callable은 return을 할 수 있다.
public class Example {
// Runnable를 파라미터로 한 함수
public static void test1(Runnable test) {
// 함수 실행
test.run();
}
// Callable를 파라미터로 한 함수
public static <V> V test2(Callable<V> test) {
// Callable은 throws로 Exception이 설정되어 있음.
try {
// Callable에서 설정된 제네릭 값이 반환 타입이다.
return test.call();
} catch (Throwable e) {
return null;
}
}
// 실행 함수
public static void main(String... args) {
// test1를 람다식으로 설정한 예제
test1(() -> {
// 콘솔 출력
System.out.println("run!");
});
// test2를 람다식으로 설정한 예제
// Callable의 제네릭은 람다식의 return 데이터 타입에 의해 자동 설정
int data = test2(() -> {
// int형이기 때문에 test2의 반환 값을 int형으로 자동 설정된다.
return 10;
});
// 콘솔 출력
System.out.println("data - " + data);
}
// run!
// data - 10
}
Parameter 넘기기
parameter를 넘기고 싶다면 이렇게 하면 된다.
@FunctionalInterface
public interface MyCallable<V, S, V> {
V call(S param1, V param2);
}
public class Example {
public static <V, S, V> void test1(MyCallable<V, S, V> callback, S param1, V param2) {
callback.call(param1, param2);
}
// 실행 함수
public static void main(String... args) {
int res = test1((p1, p2) -> p1 + p2, 10, 20); //30
}
}
728x90
반응형
'java' 카테고리의 다른 글
[java] java 17의 새로운 점들! (0) | 2024.01.11 |
---|---|
[java] Variable used in lambda expression should be final or effectively final, 람다 캡처링 (0) | 2023.12.08 |
[java] 익명클래스 (0) | 2023.04.05 |
[java] 코드 실행시간 측정하기 (0) | 2023.03.31 |
[java] List, Map에서 유용하지만 생소한 함수 정리 (0) | 2023.03.24 |