728x90
반응형
lambda
먼저 lambda에 대한 설명은 여기를 참고하자.
https://wouldyou.tistory.com/63
[java] Lambda 람다란?
람다함수 람다함수는 메소드를 하나의 식(Expression)으로 표현하는 것으로 익명함수(Anonymous function)를 생성 한다. 함수형 프로그래밍을 하고자 하며 나왔다고 한다. 자바에서는 메소드 혼자 선언
wouldyou.tistory.com
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 |