Java Lambda(双冒号)

Java Lambda(双冒号),java,Java,我能用双冒号两次吗 我有三节课 Class A { String name; B classB; } Class B { String age; C classC; } Class C { String location; } 我需要使用A::getClassB::getClassC::getLocation 这可能吗 我需要使用A::getClassB::getClassC::getLocation 这可能吗 并非如此 您正在谈论的是方法引用语法,它通过方法的名称以

我能用双冒号两次吗

我有三节课

Class A {
   String name;
   B classB;
}

Class B {
  String age;
  C classC;
}
Class C {
  String location;
}
我需要使用
A::getClassB::getClassC::getLocation

这可能吗

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

这可能吗

并非如此

您正在谈论的是方法引用语法,它通过方法的名称以及它所属的类或接口的名称、类型或实例来指定方法。根据调查,他们可以采取四种形式:

  • 对静态方法的引用:
    ContainingClass::staticMethodName
  • 对特定对象的实例方法的引用:
    containingObject::instanceMethodName
  • 对特定类型的任意对象的实例方法的引用:
    ContainingType::methodName
  • 对构造函数的引用:
    ClassName::new
  • 类型名和变量名不能包含冒号,因此可以想象的唯一一个可以提供链接冒号的是(2),在这里您将形成对lambda方法的引用。这似乎不是你想做的

    如果您的类实际上有您想要使用的getter方法,那么您应该能够编写一个类似于表达式的lambda:

    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; }
    }
    
    import java.util.function.function;
    导入java.util.function.Supplier;
    公共X类{
    //请注意为这些对象声明的类型:
    函数f1=a->a.getClassB().getClassC().getLocation();
    供应商f2=新A().getClassB().getClassC()::getLocation;
    }
    甲级{
    字符串名;
    B类B=新B();
    公共B getClassB(){return classB;}
    }
    B类{
    弦年龄;
    C类C=新的C();
    公共C getClassC(){return classC;}
    }
    C类{
    字符串位置;
    公共字符串getLocation(){return location;}
    }
    

    请特别注意,
    a->a.getClassB().getClassC().getLocation()
    是一个lambda,它为作为输入的
    a
    计算位置字符串,而
    myA.getClassB().getClassC()::getLocation
    是对
    getLocation()的引用
    通过调用
    myA.getClassB().getClassC()
    获得的特定
    C
    方法(在实例化方法引用的点,而不是在使用方法引用的点)。我怀疑其中一个是您真正想要的。

    只有当您将
    B
    C
    location
    声明为
    static
    并且相应的方法也声明为static时,您才可能不尝试它<代码>:用于statics@ACV方法引用只能引用
    static
    方法,这不是真的。@Jesper,你说得对<代码>引用包含Class::staticMethodName的静态方法引用包含object::instanceMethodName的特定对象的实例方法引用包含type::methodName的特定类型的任意对象的实例方法引用构造函数的实例方法ClassName::new,根据,这可能是可能的(MethodReference是一种主要类型,可以是LHS),但在实践中,它似乎不起作用。例如,
    (Object::toString)::toString
    不编译,
    toString
    应该是第一部分返回的任何内容的方法。