gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:01:21 24 4
gpt4 key购买 nike

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

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

它没有说“经常”或“经常”,它读起来好像你可以绝对地总是这样做。有人可以帮我澄清一下这个问题,并说明 Oracle 的声明是否正确。如果不是,那么 Oracle 本身就很糟糕,但如果能看到一些无法推断参数类型的情况示例,那就太好了。

最佳答案

这意味着在大多数情况下,编译器会自动查看您的参数,例如:

Stream.of(new Object())
.map(o -> o.toString())
.map(o -> o.toCharArray())
.flatMap(o -> Arrays.stream(o))
.foreach(o -> System.out.println(o));

虽然我们没有给出lambda表达式的参数提示,但编译器将看到以下参数类型:

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));

两个版本都可以在 java 8 编译器下正确编译。

<小时/>

也有编译器无法做到这一点的时刻,当您违反编译器的限制时,就会发生这种情况,以下示例由 Alexis C 发布:

Stream.of(new SimpleEntry<>("a", 1)).sorted(
Comparator.comparing(s -> s.getKey()).reversed())

在此示例中,知道 sorted(需要 Comparator<? super SimpleEntry> ,但对 Comparator.reversed() 的调用感到困惑因为该方法的返回类型受到输入的影响,而lambda通常会向前看它必须转换成什么类型​​。通过“揭开”lamba,我们迫使它成为我们想要的结果。

Stream.of(new SimpleEntry<>("a", 1)).sorted(
Comparator.comparing((Map.Entry<String, Integer> s) -> s.getKey()).reversed())
<小时/>

在使用这些相互冲突的前瞻和后顾系统的所有情况下都会发生此错误,我创建的另一个示例:

public static void main(String ... args) {
Function<Number, char[]> func =
convert(o->o.toString(), o->o.toCharArray()).andThen(Function.identity());
}

public static <A, B, C> Function<A, C> convert(Function<A, B> c1, Function<B, C> c2) {
return t -> c2.apply(c1.apply(t));
}

上面的代码无法编译,直到我们做到这一点:

public static void main(String ... args) {
Function<Number, char[]> func =
convert((Number o)->o.toString(), o->o.toCharArray()).andThen(Function.identity());
}

public static <A, B, C> Function<A, C> convert(Function<A, B> c1, Function<B, C> c2) {
return t -> c2.apply(c1.apply(t));
}

关于java - Java lambda 表达式语法的清晰度 - 省略参数数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34857727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com