2017-08-03 86 views
-4

可以使用雙冒號兩次嗎?Java Lambda(雙冒號)

樣品我有3類

Class A { 
    String name; 
    B classB; 
} 

Class B { 
    String age; 
    C classC; 
} 
Class C { 
    String location; 
} 

我需要使用A::getClassB::getClassC::getLocation

這可能嗎?

+8

爲什麼你不試試 – Jens

+1

只有當你將'B','C'和'location'聲明爲'static'並且相應的方法是靜態的時,才應該可能。 '::'用於靜態 – ACV

+6

@ACV方法引用只能引用'static'方法是不正確的。 – Jesper

回答

0

我需要使用A::getClassB::getClassC::getLocation

這可能嗎?

不是這樣的。

您正在討論方法引用語法,它通過名稱,名稱,類型或其所屬的類或接口的實例來指定方法。根據Java Tutorial,恰好有四種形式他們可以採取:

  1. 引用一個靜態方法:ContainingClass::staticMethodName
  2. 參考特定對象的實例方法:containingObject::instanceMethodName
  3. 參考的一個實例方法特定類型的任意物體:ContainingType::methodName
  4. 參考構造:ClassName::new

類型和變量名稱不能包含冒號,因此只有那些可以設想鏈接冒號的變量名稱是(2),然後您將在那裏形成對lambda方法的引用。這看起來並不是你想要做的。

如果你的課程實際上有getter方法,如你似乎要使用,那麼你應該能夠編寫類似的表達拉姆達:

a -> a.getClassB().getClassC().getLocation() 

另外,你應該能夠寫這種形式的方法參考:

myA.getClassB().getClassC()::getLocation 

那些具有不同的意義,如本實施例中的代碼演示:

import java.util.function.Function; 
import java.util.function.Supplier; 

public class X { 
    // Note the types declared for these objects: 
    Function<A, String> f1 = a -> a.getClassB().getClassC().getLocation();  
    Supplier<String> f2 = new A().getClassB().getClassC()::getLocation; 
} 

class A { 
    String name; 
    B classB = new B(); 

    public B getClassB() { return classB; } 
} 

class B { 
    String age; 
    C classC = new C(); 

    public C getClassC() { return classC; } 
} 

class C { 
    String location; 

    public String getLocation() { return location; } 
} 
特別

注意a -> a.getClassB().getClassC().getLocation()在於,計算在給定作爲輸入A一個位置字符串的λ,而myA.getClassB().getClassC()::getLocation是通過調用myA.getClassB().getClassC()(在該點處獲得的特定CgetLocation()方法的引用,其中所述方法參考被實例化,而不是它被使用的地方)。我懷疑其中之一就是你真正想要的。