澄清Java lambda表达式的语法 - 省略参数数据类型

时间:2016-01-18 14:58:32

标签: java syntax lambda parameters

在这个官方的Oracle教程中:https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

在Lambda表达式的语法下,它明确指出:"注意:您可以省略lambda表达式中参数的数据类型。"

它没有说"经常"或者"经常",它看起来好像你可以断言地总是这样做。有人可以为我澄清这个问题,并说明Oracle所做的陈述是否正确。如果不是,那么来自Oracle本身就会非常糟糕,但是如果无法推断出参数类型的情况,可以看到几个例子。

1 个答案:

答案 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>