java - 方法引用的 Lambda 转换

标签 java lambda java-8 method-reference

如果我有:

class B
{
    public static boolean test1(File f)
    {
        return true;
    }

    public boolean test2(File f)
    {
        return true;
    }    
}

以下对完整 lambda 表达式的转换是否正确?

File dir = new File("C:\\TEST");

// here UNBOUND instance method reference
// converted as?  dir.listFiles((File f) -> f.isFile());
dir.listFiles(File::isFile);        

// here static method reference
// converted as? dir.listFiles((File f) -> B.test1(f));
dir.listFiles(B::test1);  

// here BOUND instance method reference
// converted as?  dir.listFiles((File f) -> b.test2(f));
B b = new B();
dir.listFiles(b::test2);  

那么,还有一个问题: 如果我写:dir.listFiles(B::test2); 我从编译器那里得到:

non-static method test2(File) cannot be referenced from a static context

但为什么不抛出该错误:dir.listFiles(File::isFile);

最佳答案

简短回答:是的,您的转换是正确的。

public void question() {
    File dir = new File("C:\\TEST");

    // here UNBOUND instance method reference
    dir.listFiles((File f) -> f.isFile());
    dir.listFiles(File::isFile);

    // here static method reference
    dir.listFiles((File f) -> B.test1(f));
    dir.listFiles(B::test1);

    // here BOUND instance method reference
    B b = new B();
    dir.listFiles((File f) -> b.test2(f));
    dir.listFiles(b::test2);
}

编译问题是因为引用;

dir.listFiles(B::test2);

或(扩展为 lambda);

dir.listFiles((pathname) -> B.test2(pathname));

正在尝试以静态方法访问 test2。这是一个静态方法引用。鉴于

dir.listFiles(File::isFile);        

或作为 lambda;

dir.listFiles((f) -> f.isFile())

是一个实例方法引用,它指的是File 类中的一个(非静态)方法。

因此,尽管 File::isFile 看起来像一个静态引用,但在此上下文中使用 type 实际上是在引用一个对象!很奇怪吧?

关于java - 方法引用的 Lambda 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21140954/

相关文章:

java - 是否可以使用 Lambda 而不是匿名类来创建新对象?

Java 8 Stream - 减少函数的组合器没有被执行

java - ArrayList 和 HashSet 插入性能测试结果让我很困惑

java - Spring消息包问题

python - Python 3 上的 Lambda

Python 合并列-行中的值(单元格类型为列表)

java - Spring 过滤器在初始化函数后丢失设置变量

iterator - Java 8 迭代器流到迭代器会导致对 hasNext() 的冗余调用

Java 字符 [] 到字符串

java.lang.String 无法转换为 java.util.Map$Entry 且分页缺少必需的属性