当需要把一段逻辑作为参数传入函数/方法时
Java:匿名内部类
public class JavaDemo {
public interface IOneMethod {
void fun();
}
public static void set(IOneMethod oneMethod) {
oneMethod.fun();
}
public interface IMultiMethods {
void fun1();
void fun2();
}
public static void set(IMultiMethods multiMethods) {
multiMethods.fun1();
multiMethods.fun2();
}
public static void main(String[] args) {
set(() -> System.err.println("Java IOneMethod fun()"));
set(new IMultiMethods() {
@Override
public void fun1() {
System.err.println("Java IMultiMethods fun1()");
}
@Override
public void fun2() {
System.err.println("Java IMultiMethods fun2()");
}
});
}
}
Kotlin:Lambda表达式(函数式接口) 或 对象表达式
fun set(action: (a: Int) -> Unit) {
val a: Int = 0
action(a)
}
fun interface IOneFunction {
fun fun1(a: Int)
}
fun set(oneFunction: IOneFunction) {
val a: Int = 0
oneFunction.fun1(a)
}
interface IMultiFunctions {
fun fun1(a: Int)
fun fun2(a: Int)
}
fun set(iMultiFunctions: IMultiFunctions) {
var a: Int = 1
iMultiFunctions.fun1(a)
a = 2
iMultiFunctions.fun2(a)
}
fun main() {
set { println("Kotlin IOneFunction fun1 $it") }
set(object : IMultiFunctions {
override fun fun1(a: Int) {
println("Kotlin IMultiFunctions fun1 $a")
}
override fun fun2(a: Int) {
println("Kotlin IMultiFunctions fun2 $a")
}
})
}
C/C++:函数指针
#pragma once
#include <string>
#include <iostream>
using namespace std;
typedef void FUN1();
typedef void FUN2(int);
static void fun1() {
cout << "C/C++ fun1()" << endl;
}
static void fun2(int a) {
cout << "C/C++ fun2() " << a << endl;
}
static void set(FUN1* fun1, FUN2* fun2) {
fun1();
int a = 0;
fun2(a);
}
int main() {
set(fun1, fun2);
return 0;
}