实例方法引用的语法是什么?
引用静态方法的语法在前一节已经提到过了。有两种引用实例方法的方式。一种是严格类似于静态引用的方式,用“对象引用::标识符”替换“类型引用::标识符”。例如:forEach方法可以用来传递集合中的每个元素给一个实例函数来处理:
这不是实例方法引用最有用变型,但是,forEach的该参数(或任何其他接受这样一个函数的方法)不能引用它正在处理的元素。相反,假定pointList的元素属于一个类TransPoint其有一个方法
我们经常想以这种形式书写:
实例方法引用的第二个语法变型支持这种用法。类似于:
——其中引用类型而不是对象引用用于与实例方法名连接在一起使用——其由编译器翻译成这样一个lambda表达式:
——也就是说,一个lambda表达式被合成一个单一的参数,然后将其用作接收实例方法的调用。所以语法
达成我们想要的结果。相同的变换可以应用到使用任何数量参数的实例方法,在每一种情况下,一个额外的参数,即接收方,调用参数之前被插入。
原文链接:http://www.lambdafaq.org/what-is-the-syntax-for-instance-method-references/
引用静态方法的语法在前一节已经提到过了。有两种引用实例方法的方式。一种是严格类似于静态引用的方式,用“对象引用::标识符”替换“类型引用::标识符”。例如:forEach方法可以用来传递集合中的每个元素给一个实例函数来处理:
pointList.forEach(System.out::print);
这不是实例方法引用最有用变型,但是,forEach的该参数(或任何其他接受这样一个函数的方法)不能引用它正在处理的元素。相反,假定pointList的元素属于一个类TransPoint其有一个方法
void transpose () { int t = x; x = y; y = t; };
我们经常想以这种形式书写:
pointList.forEach(/*transpose x and y of this element*/);
实例方法引用的第二个语法变型支持这种用法。类似于:
TransPoint::transpose
——其中引用类型而不是对象引用用于与实例方法名连接在一起使用——其由编译器翻译成这样一个lambda表达式:
(TransPoint pt) -> { pt.transpose(); }
——也就是说,一个lambda表达式被合成一个单一的参数,然后将其用作接收实例方法的调用。所以语法
pointList.forEach(TransPoint::transpose);
达成我们想要的结果。相同的变换可以应用到使用任何数量参数的实例方法,在每一种情况下,一个额外的参数,即接收方,调用参数之前被插入。
原文链接:http://www.lambdafaq.org/what-is-the-syntax-for-instance-method-references/