2017-08-03 2 views
-4

Kann ich einen doppelten Doppelpunkt zweimal verwenden?Java Lambda (doppelter Doppelpunkt)

Probe Ich habe 3 Klasse

Class A { 
    String name; 
    B classB; 
} 

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

I A::getClassB::getClassC::getLocation

Ist dies möglich verwenden?

+8

Warum Sie es nicht versuchen – Jens

+1

Sollte nur möglich sein, wenn Sie 'B',' C' und 'location' als' statisch' deklarieren und die entsprechenden Methoden ebenfalls statisch. '::' ist für Statik – ACV

+6

@ACV es ist nicht wahr, dass Methodenreferenzen nur 'statische' Methoden referenzieren können. – Jesper

Antwort

0

Ich brauche A::getClassB::getClassC::getLocation

Ist das möglich zu benutzen?

Nicht als solche.

Sie sprechen über Methodenreferenzsyntax, die eine Methode über ihren Namen und entweder den Namen, den Typ oder eine Instanz einer Klasse oder Schnittstelle angibt, zu der sie gehört. Nach dem Java Tutorial gibt es genau vier Formen können sie nehmen:

  1. Verweis auf eine statische Methode: ContainingClass::staticMethodName
  2. Verweis auf eine Instanz Methode eines bestimmten Objekts: containingObject::instanceMethodName
  3. Verweis auf eine Instanz Methode ein beliebiges Objekt eines bestimmten Typs: ContainingType::methodName
  4. Referenz auf einen Konstruktor: ClassName::new

Typ- und Variablennamen dürfen keine Doppelpunkte enthalten, so dass der einzige von denen, die möglicherweise verkettende Doppelpunkte liefern könnten, (2) wäre, wo Sie dann eine Referenz auf eine Methode eines Lambda bilden würden. Das scheint nicht das zu sein, was du machen willst.

Wenn Ihre Klassen tatsächlich Getter-Methoden hatten, wie Sie verwenden zu wollen scheinen, dann sollten Sie in der Lage sein, eine Lambda ähnlich wie Ihr Ausdruck zu schreiben:

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

Alternativ sollten Sie in der Lage sein, ein schreiben Verfahren Bezug dieser Form:

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

Die haben unterschiedliche Bedeutung, wie das folgende Beispiel-Code demonstriert:

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; } 
} 

Hinweis insbesondere, dass a -> a.getClassB().getClassC().getLocation() ist ein Lambda, das das für ein A als Eingabe gegeben einen Ort Zeichenfolge berechnet, während myA.getClassB().getClassC()::getLocation ist ein Verweis auf die getLocation() Verfahren der bestimmten C durch myA.getClassB().getClassC() Aufruf erhalten (an dem Punkt, wo die Methode Referenz instanziiert , nicht der Punkt, wo es verwendet wird). Ich vermute, dass einer von denen ist, was Sie wirklich wollen.

Verwandte Themen