Java Lambda(双冒号)

时间:2017-08-03 13:32:24

标签: java

我可以两次使用双结肠吗?

示例我有3个班级

Class A {
   String name;
   B classB;
}

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

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

这可能吗?

1 个答案:

答案 0 :(得分:0)

  

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

     

这可能吗?

不是这样。

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

  1. 参考静态方法:ContainingClass::staticMethodName
  2. 引用特定对象的实例方法:containingObject::instanceMethodName
  3. 引用特定类型的任意对象的实例方法:ContainingType::methodName
  4. 对构造函数的引用:ClassName::new
  5. 类型和变量名称不能包含冒号,因此可以想象得到链式冒号的唯一一个是(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; }
    }
    

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