Wil*_*ood 11 java java-8 java-stream method-reference
说我有以下代码
public class A {
int x;
public boolean is() {return x%2==0;}
public static boolean is (A a) {return !a.is();}
}
Run Code Online (Sandbox Code Playgroud)
而在另一堂课......
List<A> a = ...
a.stream().filter(b->b.isCool());
a.stream().filter(A::is);
//would be equivalent if the static method is(A a) did not exist
Run Code Online (Sandbox Code Playgroud)
问题是如何使用A :: is类型表示法引用实例方法版本?非常感谢
nos*_*sid 12
在您的示例中,静态和非静态方法都适用于过滤器方法的目标类型.在这种情况下,您不能使用方法引用,因为无法解决歧义.有关详细信息,请参见§15.13.1 方法参考的编译时声明,特别是以下引用和下面的示例:
如果第一次搜索产生静态方法,并且没有适用的非静态方法[..],则编译时声明是第一次搜索的结果.否则,如果没有静态方法适用[..],并且第二次搜索产生非静态方法,则编译时声明是第二次搜索的结果.否则,没有编译时声明.
在这种情况下,您可以使用lambda表达式而不是方法引用:
a.stream().filter(item -> A.is(item));
Run Code Online (Sandbox Code Playgroud)
关于搜索静态和非静态方法的上述规则有点特殊,因为无关紧要,哪种方法更适合.即使静态方法采用Object而不是A,它仍然是模棱两可的.出于这个原因,我建议作为一般指导:如果一个类中有多个具有相同名称的方法(包括从基类继承的方法):
| 归档时间: |
|
| 查看次数: |
7225 次 |
| 最近记录: |