为什么在lambda表达式中使用过滤器时会出现错误?

为什么在lambda表达式中使用过滤器时会出现错误?,lambda,java-8,java-stream,functional-interface,Lambda,Java 8,Java Stream,Functional Interface,我不熟悉lambda表达式。我有以下代码: List<String> someNumbers = Arrays.asList("N40", "N36", "B12", "B6", "G53", "G49", "G60", "G50", "G53", "I26", "I17", "I29", "O71"); someNumbers .stream() .filter(startsWith("G")) 在上面,流被传递到过滤器。那么,这

我不熟悉lambda表达式。我有以下代码:

List<String> someNumbers = Arrays.asList("N40", "N36", "B12", "B6", "G53", "G49", "G60", "G50", "G53", "I26", "I17", "I29", "O71");

someNumbers
            .stream()
            .filter(startsWith("G"))
在上面,流被传递到过滤器。那么,这个论点的必要性是什么呢?例如,“.map”处理它时如果用作

.map(String::toUppercase).

我想是关于方法参考的基本知识

String::toUppercase
相当于:

s -> s.toUppercase()
s -> s.startsWith("G")
而:

startsWith("G")
理论上相当于:

s -> s.toUppercase()
s -> s.startsWith("G")

这是语言所不允许的

好吧,与其说“这是语言不允许的”,不如说
startsWith(“G”)
在Java语言中已经有了一个含义,即“此时调用此方法并使用返回值”,持续25年并将其更改为“不要调用此方法,但在此时创建一个可能调用此方法的谓词实例”将是一个非常具有破坏性的更改。那么实际希望调用方法并使用返回谓词的代码呢?请仔细查看。在每种编程语言中,您都必须遵守语法规则。