在这个官方的Oracle教程中:https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
在Lambda表达式的语法下,它明确指出:"注意:您可以省略lambda表达式中参数的数据类型。"
它没有说"经常"或者"经常",它看起来好像你可以断言地总是这样做。有人可以为我澄清这个问题,并说明Oracle所做的陈述是否正确。如果不是,那么来自Oracle本身就会非常糟糕,但是如果无法推断出参数类型的情况,可以看到几个例子。
答案 0 :(得分:2)
这意味着在大多数情况下,编译器会自动查看您的参数,例如:
\f
虽然我们没有给lamba表达式的参数提供任何提示,但编译器将看到以下类型的参数:
\r
两个版本都在java 8编译器下正确编译。
还有一段时间编译器无法执行此操作,当您遇到编译器的限制时会发生这种情况,以下示例由Alexis C发布:
line.separator
在此示例中,知道line.separator
需要Stream.of(new Object())
.map(o -> o.toString())
.map(o -> o.toCharArray())
.flatMap(o -> Arrays.stream(o))
.foreach(o -> System.out.println(o));
,但是对Stream.of(new Object())
.map((Object o) -> o.toString())
.map((String o) -> o.toCharArray())
.flatMap((char[] o) -> Arrays.stream(o))
.foreach((char o) -> System.out.println(o));
的调用感到困惑,因为该方法的返回类型受输入影响,而lamba通常会向前看,看看它必须改变什么类型。通过" unnaking"兰巴,我们强迫它成为我们想要的结果。
Stream.of(new SimpleEntry<>("a", 1)).sorted(
Comparator.comparing(s -> s.getKey()).reversed())
在使用这些冲突的前瞻和后置系统的所有情况下都会发生此错误,这是我创建的另一个示例:
sorted(
上述内容无法编译,直到我们做到这一点:
Comparator<? super SimpleEntry>