一般来说匿名函数与匿名类用于回调,因为你可能并不知道回调函数或方法的具体实现,并且可能需要根据实际情况进行改变,并且匿名函数不需要使用具体的对象,也减少了开销
下面看看PHP的匿名函数应用实现
<?php
interface Comparator {
function compare($i, $j);
}
function getResult($i, $j, $comparator) {
echo $comparator($i, $j);
}
$comparator1 = function($i, $j) {
if($i > $j) {
return 1;
} else if($i < $j) {
return -1;
} else {
return 0;
}
};
$comparator2 = function($i, $j) {
$ilen = strlen($i);
$jlen = strlen($j);
if($ilen > $jlen) {
return 1;
} else if($ilen < $jlen) {
return -1;
} else {
return 0;
}
};
getResult(1, 2, $comparator1);
getResult(1, 2, $comparator2);
#或者直接这样调用
getResult(1, 2, function($i, $j) {
$ilen = strlen($i);
$jlen = strlen($j);
if($ilen > $jlen) {
return 1;
} else if($ilen < $jlen) {
return -1;
} else {
return 0;
}
});
?>
再来看看JAVA匿名类的实现
MyComparator.java
public interface MyComparator<E> {
int compare(E e);
}
Game.java
public class Game<E> {
public void play(E[] array, MyComparator mc) {
int result = mc.compare(array[array.length - 1], array[0]);
if(result > 0) {
System.out.println("Oh no... You Win");
} else if(result == 0) {
System.out.println("Emmm... Draw");
} else {
System.out.println("Haha... You Lose");
}
}
}
Test.java
public static void main(String[] args) {
Game<Integer> game = new Game<Integer>();
Integer[] intArr = {1, 2, 3};
game.play(intArr, new MyComparator<Integer>() {
@Override
public int compare(Integer e1, Integer e2) {
if(e1 > e2) {
return 1;
} else if(e1.equals(e2)) {
return 0;
} else {
return -1;
}
}
});
}