This question already has answers here:
What is the equivalent lambda expression for System.out::println
                                
                                    (2个答案)
                                
                        
                        
                            Function pointer to String method in Java
                                
                                    (3个答案)
                                
                        
                                2年前关闭。
            
                    
如果将光标放在IntelliJ IDEA中的绑定接收器方法引用(例如str::toUpperCase)上,然后按Alt + Enter,则可以用lambda替换它。如果继续,它将方法引用更改为() -> str.toUpperCase()。这可能是IntelliJ IDEA中的错误,尽管我怀疑这也是其他IDE中的常见错误。为什么?好吧,这并不总是等同的。采取以下小难题。以下代码的输出是什么?

import java.util.function.Supplier;

public class Scratch {

    private static String str;

    public static void main(String[] args) {
        str = "a";
        Supplier<String> methodref = str::toUpperCase;
        Supplier<String> lambda = () -> str.toUpperCase();

        str = "b";
        System.out.println(methref.get());
        System.out.println(lambda.get());
    }
}


此代码显示方法引用和lambda不相等。该代码在每行上打印不同的值:“ a”和“ b”。我的问题是:这种方法引用的正确lambda等效项是什么?

最佳答案

对于您的供应商设置,答案是:没有对等的东西。

当你写:

str = "a";
Supplier<String> methodref = str::toUpperCase;


它从字面上变为"a"::toUpperCase(实际编译)。

关于java - 方法引用↔lambda等价,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52832698/

10-09 19:13