匿名內部類是如何在Java中使用的?在Java中匿名類的用途是什么?我們可以說使用匿名類是Java的優勢之一嗎?
4 回答
千萬里不及你
TA貢獻1784條經驗 獲得超9個贊
匿名內部類實際上是閉包,因此可以用來模擬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);這是一個精心設計的例子,但很容易看出,能夠像傳遞值一樣傳遞函數是一個非常有用的特性。
搖曳的薔薇
TA貢獻1793條經驗 獲得超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");
}
});
}
}
慕標5832272
TA貢獻1966條經驗 獲得超4個贊
Map map = new HashMap() {{
put("key", "value");}};Map map = new HashMap();map.put("key", "value");添加回答
舉報
0/150
提交
取消
