Java Lambda(双冒号)

问题描述:

可以使用双冒号两次吗?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

我需要使用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()方法的引用,其中所述方法参考被实例化,而不是它被使用的地方)。我怀疑其中之一就是你真正想要的。