4 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個贊
匿名內(nèi)部類實(shí)際上是閉包,因此可以用來模擬lambda表達(dá)式或“委托”。例如,以這個接口為例:
public?interface?F<A,?B>?{ ???B?f(A?a);}
您可以使用此匿名創(chuàng)建一級函數(shù)在爪哇。假設(shè)您有以下方法,它返回比給定列表中的我大的第一個數(shù)字,或者如果沒有更大的數(shù)字,則返回我:
public?static?int?larger(final?List<Integer>?ns,?final?int?i)?{ ??for?(Integer?n?:?ns) ?????if?(n?>?i) ????????return?n; ??return?i;}
然后,有另一個方法返回比給定列表中的我小的第一個數(shù)字,或者,如果沒有更小的數(shù)字,則返回I:
public?static?int?smaller(final?List<Integer>?ns,?final?int?i)?{ ???for?(Integer?n?:?ns) ??????if?(n?<?i) ?????????return?n; ???return?i;}
這些方法幾乎是相同的。使用第一類函數(shù)類型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);
這是一個精心設(shè)計的例子,但很容易看出,能夠像傳遞值一樣傳遞函數(shù)是一個非常有用的特性。

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個贊
class A{ public void methodA() { System.out.println("methodA"); }}class B{ A a = new A() { public void methodA() { System.out.println("anonymous methodA"); } };}
interface interfaceA{ public void methodA();}class B{ interfaceA a = new interfaceA() { public void methodA() { System.out.println("anonymous methodA implementer"); } };}
interface Foo { void methodFoo(); } class B{ void do(Foo f) { }}class A{ void methodA() { B b = new B(); b.do(new Foo() { public void methodFoo() { System.out.println("methodFoo"); } }); } }

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個贊
Map map = new HashMap() {{ put("key", "value");}};
Map map = new HashMap();map.put("key", "value");
添加回答
舉報