匿名内部类实际上是闭包,因此它们可用于模拟 lambda 表达式或“委托”。以这个接口为例:
public interface F<A, B> {
B f(A a);
}
您可以匿名使用它在 Java 中创建 first-class function。假设您有以下方法,它返回给定列表中大于 i 的第一个数字,如果没有更大的数字,则返回 i:
public static int larger(final List<Integer> ns, final int i) {
for (Integer n : ns)
if (n > i)
return n;
return i;
}
然后你有另一个方法返回给定列表中小于 i 的第一个数字,如果没有数字更小,则返回 i:
public static int smaller(final List<Integer> ns, final int i) {
for (Integer n : ns)
if (n < i)
return n;
return i;
}
这些方法几乎相同。使用第一类函数类型 F,我们可以将它们重写为一个方法,如下所示:
public static <T> T firstMatch(final List<T> ts, final F<T, Boolean> f, T z) {
for (T t : ts)
if (f.f(t))
return t;
return z;
}
您可以使用匿名类来使用 firstMatch 方法:
F<Integer, Boolean> greaterThanTen = new F<Integer, Boolean> {
Boolean f(final Integer n) {
return n > 10;
}
};
int moreThanMyFingersCanCount = firstMatch(xs, greaterThanTen, x);
这是一个非常人为的例子,但是很容易看出能够像传递值一样传递函数是一个非常有用的特性。请参阅 Joel 本人的 "Can Your Programming Language Do This"。
一个很好的 Java 编程库:Functional Java.