目前,我认为以下 Java 8 lambda表达式没有区别:
参数类型指定:
Arrays.sort(strArray, (String s1, String s2) -> s2.length() - s1.length());
参数类型省略:
Arrays.sort(strArray, (s1, s2) -> s2.length() - s1.length());
编辑:一般来说,在Java 8 lambda表达式中指定参数类型的 pros 和 cons 是什么?什么时候需要指定?
我想到了几个可能的原因(但我确信还有更多):
答案 0 :(得分:6)
没有区别。这取决于你的权衡。但坦率地说,你最好不要写这些;相反,import static java.util.Comparator.comparingInt
和Arrays.sort(strArray, comparingInt(String::length))
。第一个版本不是更加类型安全;第二个版本将推断完全相同的类型信息并完全执行它。
答案 1 :(得分:1)
lambda函数元素类型由操作元素类型决定。(strArray
):
public static <T> void sort(T[] a, Comparator<? super T> c) {
}
比较器类型为generics
,它由传递的参数类型决定。
另一个lambda
函数也是相同的:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
T reduce(T identity, BinaryOperator<T> accumulator);
...
所以指定参数类型与否,编译器已经知道参数类型应该是什么。
答案 2 :(得分:1)
关于@ louis-wasserman在评论中所说的,还有一个很好的例子,你可能想问这个问题:
// DOES NOT compile
Arrays.sort(array, Comparator.comparingInts(str -> str.length()).reversed());
// DOES compile
Arrays.sort(array, Comparator.comparingInts((String str) -> str.length()).reversed());
我理解它的方式,Comparator.reversed()
需要某种合同来确定收集本身是如何订购的。如果不知道str
的类型,就不会知道.length()
的返回类型,从而违反了此合同。