何时在lambda表达式中指定参数类型

时间:2015-10-18 04:46:53

标签: java lambda java-8

目前,我认为以下 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 是什么?什么时候需要指定?

我想到了几个可能的原因(但我确信还有更多):

  • 指定时的其他类型安全检查
  • 更好的代码可读性

3 个答案:

答案 0 :(得分:6)

没有区别。这取决于你的权衡。但坦率地说,你最好不要写这些;相反,import static java.util.Comparator.comparingIntArrays.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()的返回类型,从而违反了此合同。