java – 为什么消费者接受语句体而不是表达体的lambdas?
以下代码令人惊讶地成功编译:
Consumer<String> p = ""::equals; 这个也是: p = s -> "".equals(s); 但这是失败的错误布尔值无法按预期转换为void: p = s -> true; 使用括号修改第二个示例也会失败: p = s -> ("".equals(s)); 它是Java编译器中的错误还是我不知道的类型推断规则? 解决方法
首先,值得看一下Consumer< String>实际上是.
From the documentation:
所以这是一个接受String并且不返回任何内容的函数. Consumer<String> p = ""::equals; 编译成功因为equals可以采用String(实际上是任何Object).等于的结果只是被忽略了.* p = s -> "".equals(s); 这完全相同,但语法不同.编译器知道不添加隐式返回,因为Consumer不应返回值.如果lambda是一个函数< String,Boolean> ;,它将添加一个隐式返回.虽然. p = s -> true; 这需要一个String(s),但因为true是表达式而不是语句,所以不能以相同的方式忽略结果.编译器必须添加隐式返回,因为表达式本身不能存在.因此,这确实有一个返回:布尔值.因此,它不是消费者.** p = s -> ("".equals(s)); 同样,这是一个表达,而不是一个陈述.暂时忽略lambdas,你会看到System.out.println(“Hello”)行;如果将它包装在括号中,它将同样无法编译. *自the spec起:
**从the spec(谢谢,Eugene):
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |