千万里不及你
匿名内部类实际上是闭包,因此可以用来模拟lambda表达式或“委托”。例如,以这个接口为例:public interface F<A, B> {
B f(A a);}您可以使用此匿名创建一级函数在爪哇。假设您有以下方法,它返回比给定列表中的我大的第一个数字,或者如果没有更大的数字,则返回我:public static int larger(final List<Integer> ns, final int i) {
for (Integer n : ns)
if (n > i)
return n;
return 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);这是一个精心设计的例子,但很容易看出,能够像传递值一样传递函数是一个非常有用的特性。