可以使用方法引用来访问静态方法吗?

new*_*gic 1 java java-8 java-stream method-reference

根据:

https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

看起来它是可能的,但是尝试真正返回编译错误.由于我们无法使用静态方法实现接口,因此它更有意义.

public class SomeClass {

    static public boolean getB(){
        return false;
    }
}

List<SomeClass> list = new ArrayList<>();       
list.add(new SomeClass());

// below causes compile error, which I expect, however documentation indicates oherwise
list.stream().filter(SomeClass::getB).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

这是编译错误:

"此行的多个标记 - 应该以静态方式访问SomeClass类型的方法getB() - Stream类型中的方法过滤器(Predicate)不适用于参数(SomeClass :: getB)"

JB *_*zet 6

您可以,但方法的返回类型和参数必须与功能接口的唯一方法(Predicate<Something>此处)相匹配.

假设你的列表是a List<Something>,因为谓词应该基于Somethingas输入返回一个布尔值,如果你的方法定义为

public static boolean getB(Something s)
Run Code Online (Sandbox Code Playgroud)

要么

public static boolean getB(Object o)
Run Code Online (Sandbox Code Playgroud)

  • 它生成的字节码较少,而且通常更易读.我发现`persons.sort(Comparator.comparing(Person :: getLastName).thenComparing(Person :: getFirstName))`非常自然和可读.多于`persons.sort(Comparator.comparing(person - > person.getLastName()).thenComparing(person - > person.getFirstName()))`.甚至更多的东西,如`reduce(Integer :: sum)`而不是`reduce((i1,i2) - > i1 + i2)`. (2认同)